LiveData is an observable data holder class. Unlike a regular observable, LiveData is lifecycle-aware, meaning it respects the lifecycle of other app components, such as activities, fragments, or services. This awareness ensures LiveData only updates app component observers that are in an active lifecycle state
구글에서 말한 LiveData에 대해 읽어보자.
LiveData is an observable data holder class.
Unlike a regular observable, LiveData is lifecycle-aware, meaning it respects the lifecycle of other app components, such as activities, fragments, or services.
This awareness ensures LiveData only updates app component observers that are in an active lifecycle state
즉, View의 Lifecycle이 Active한 상태에서만 데이터를 업데이트 시켜주는 Lifecycle-aware Observable data holder class이다.
private val _movieDetailData = MutableLiveData<MovieDetailResponse>()
val movieDetailData: LiveData<MovieDetailResponse>
get() = _movieDetailData
fun getDetailData(movieId : Int){
addDisposable(movieRepo.getMovieDetail(
movie_id = movieId,
apikey = API_KEY,
language = KR_LANGUAGE,
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
it.run {
_movieDetailData.postValue(it)
}
},{
Log.d(TAG, it.localizedMessage)
})
)
위는 일종의 예시임으로 보는 것만으로 이해하자.
rx가 들어간 예시이지만 LiveData부분만 보면 되겠다.
MVVM 아키텍처에서 데이터를 받아오고 관리하는 곳으로는 ViewModel이 된다.
그래서 뷰모델에서 LiveData를 선언할때 알아야할 점이 있다.
MutableLiveData와 LiveData의 차이.
- 이름에서 유추가능하지만 MutableLiveData는 수정가능한 LiveData클래스이다.
선언된 클래스에서만 데이터를 저장하기 위해 사용 되며 private를 붙여 사용한다.- LiveData는 객체 내 데이터 수정이 불가하며 외부에서 접근 하기에 한정자를 붙이지 않는다. 그래서 외부에서 LiveData를 옵저빙할때 get()으로 MutableLiveData를 읽어와서 던져준다.
MutableLiveData와 LiveData를 구분하는 _에 대해선 컨벤션으로 아래 글을 읽어보자.
Names for backing properties
If a class has two properties which are conceptually the same but one is part of a public API and another is an implementation detail, use an underscore as the prefix for the name of the private property
/* observe */
private fun observeMovieDetailData(){
viewModel.movieDetailData.observe(this, {
viewDataBinding.toolbarLayout.title = it.title
viewDataBinding.contentLayout.apply {
tvDetailReleaseDate.text = releaseDateParsing(it.release_date)
tvDetailRuntime.text = runtimeParsing(it.runtime)
tvDetailGenre.text = genreParsing(it.genres)
tvDetailOverview.text = it.overview
}
intentMovieData = Movie(it.id,it.title,it.overview,it.release_date,it.genres)
})
}
위의 코드에서 볼 수 있듯 ViewModel에서 데이터를 observe하고
가져온 데이터에 대해서 처리를 해주고 있다.
위의 예시는 databinding에 값들을 바인딩해주고 있다.
RxJava가 적용된 프로젝트라면 LiveData 대신 RxJava를 사용할 수도 있다.
LiveData도 RxJava와 유사하게 데이터가 변경 될 경우, Observer에게 데이터 변경을 알려주기에.
하지만, RxJava를 사용할 경우, 앱 수명주기에 맞춰 dispose를 해야하는 불편함이 존재한다.
그와 반대로 LiveData를 사용할 경우, 위에서 말한 LiveData 이점이 있어서 굳이 RxJava로 LiveData를 대체하진 않는다.