-
LiveData란
LiveData는 observable data holder class로 안드로이드 Lifecycle에 따라 데이터를 관리한다. 예를 들어 Activity에 선언되어 있는 LiveDate의 경우 Activity의 생명주기가 Started, Resumed 상태이면 데이터의 변경을 처리하지만 다른 Activity로 넘어가있는 Stoped등의 상태일 때는 처리하지 않는다.
구글 문서를 참고하면 아래와 같은 장점을 확인할 수 있다.
- UI와 데이터 상태의 일치 보장
: observable 패턴을 사용하기 때문에 데이터의 변화를 observer 객체에 알리다.
- 메모리 누수 없음
: observer는 lifecycle 객체에 결합되어 있으며 연결된 수명 주기가 끝나면 자동으로 삭제된다.
- 최신 데이터 유지
: 수명 주기가 비활성화되면 다시 활성화될 때 최신 데이터를 수신한다. 예를 들어 백그라운드에 있었던 활동은 포그라운드로 돌아온 직후 최신 데이터를 받는다.
- 적절한 구성 변경
: 기기 회전이 일어나도 최신 데이터를 처리할 수 있도록 도와준다.(AAC-ViewModel과 함께 활용 시)
- 리소스 공유
: 싱글톤 패턴을 사용하는 LiveData 인스턴스를 확장하여 시스템 서비스를 앱에서 공유하도록 래핑 가능
LiveData 생성하기
LiveData는 Collections를 구현하는 List와 같은 객체를 비롯하여 모든 데이터와 함께 사용할 수 있는 wrapper이다.
LiveData 객체는 대개 ViewModel에 저장된다.
class NameViewModel : ViewModel() { // Create a LiveData with a String val currentName: MutableLiveData<String> by lazy { MutableLiveData<String>() } // Rest of the ViewModel... }
- LiveData : 값의 get()만을 할 수 있다.
- MutableLiveData : 값의 get/set 모두를 할 수 있다.
LiveData 관찰하기
대부분의 경우 앱 구성요소의 onCreate() 메서드는 LiveData 객체 관찰을 시작하기 적합한 장소이며 그 이유는 다음과 같다.
- 시스템이 Activity나 Fragment의 onResume() 메서드에서 중복 호출을 하지 않도록 하기 위해서
- Activity나 Fragment는 STARTED 상태가 되는 즉시 관찰하고 있던 LiveData 객체에서 최신 값을 수신한다. 이는 관찰할 LiveData 객체가 설정된 경우에만 발생한다.
class NameActivity : AppCompatActivity() { // Use the 'by viewModels()' Kotlin property delegate // from the activity-ktx artifact private val model: NameViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ... // Create the observer which updates the UI. val nameObserver = Observer<String> { newName -> // Update the UI, in this case, a TextView. nameTextView.text = newName } // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer. model.currentName.observe(this, nameObserver) } }
nameObserver를 매개변수로 전달하여 observe()를 호출하면 onChanged()가 즉시 호출되어 mCurrentName에 저장된 최신 값을 제공한다. LiveData 객체가 mCurrentName에 값을 설정하지 않았다면 onChanged()는 호출되지 않는다.
LiveData 업데이트
MutableLiveData 클래스는 setValue(T) 및 postValue(T) 메서드로 저장된 값을 수정한다.
button.setOnClickListener { val anotherName = "John Doe" model.currentName.setValue(anotherName) }
setValue(T)를 호출하면 관찰자는 John Doe 값과 함께 onChanged() 메서드를 호출한다.
LiveData는 항상 MainThread로 값을 처리한다. setValue를 하든 postValue를 하든 LiveData는 항상 MainThread에서 사용할 값을 보증한다. UI 업데이트를 하지 않을 경우, 데이터의 처리가 IO에서 발생해야 하는 경우라면 LiveData 활용은 맞지 않는다.
LiveData 변환
Transformations.map()
LiveData의 변경사항을 Observe해서 함수를 통해 원하는값으로 변경한뒤 반환한다.
이 메서드는 Observable.map (Function)과 유사하다. 변환은 메인 스레드에서 실행된다.
val userLiveData: LiveData<User> = UserLiveData() val userName: LiveData<String> = Transformations.map(userLiveData) { user -> "${user.name} ${user.lastName}" }
Transformations.switchMap()
LiveData를 변경사항을 받아서 다른 LiveData를 발행한다.
private fun getUser(id: String): LiveData<User> { ... } val userId: LiveData<String> = ... val user = Transformations.switchMap(userId) { id -> getUser(id) }
References
- https://developer.android.com/topic/libraries/architecture/livedata?hl=ko
- https://thdev.tech/android/2021/02/01/LiveData-Intro/
'Android' 카테고리의 다른 글
Room And Coroutines (0) 2021.06.10 LiveData beyond the ViewModel (0) 2021.06.04 Android Kotlin Fundamentals - ViewModel(2) (0) 2021.05.30 Android Kotlin Fundamentals - ViewModel(1) (0) 2021.05.29 ViewModel (0) 2021.05.28