2021. 1. 22. 14:04ㆍAndroid/LiveData
MutableLiveData란 변경할 수 있는 LiveData 형입니다.
일반적인 LiveData형은 변경할 수 없고 오로지 데이터의 변경값만을 소비하는데 반해
MutableLiveData는 데이터를 UI Thread와 Background Thread에서 선택적으로 바꿀 수 있습니다.
private val _post = MutableLiveDta<User>()
// _post로 선언된 MutableLiveData를 post를 통해 발행합니다.
// 이렇듯 ViewModel에서만 _post를 변경할 수 있기때문에 보안에 더 좋습니다.
val post :LiveData<Post>
get() = _post
데이터를 Activity에서 받으려면
//조금전 ViewModel에서 post LiveData를 Observe합니다.
//첫번째 인자는 UI이며 해당 인자로 어떤 UI Thread를 사용할지 결정합니다.
//두번째는 Observe 콜백입니다.
postViewModel.post.observe(this,
Observer{
post -> postTitle.text = post?.title
}
)
LiveData 콜백을 실행하는 방법
post.setValue(post) //UI Thread즉 Main Thread에서 실행
post.postValue(post) //Background Thread에서 실행
Transformation(map, switchmap, mediatorLiveData)
Map
val userLiveData:LiveData = ...;
val userNameLLiveData = Transformations.map(userLiveData, user -> {
return user.firstName + " " + user.lastName; // String을 리턴합니다.
});
UserLiveData의 변경사항을 Observe해서 함수를 통해 원하는값으로 변경한뒤 ‘String’을 리턴합니다. 즉 새로운 LiveData를 리턴하는게 아닌 데이터만 변경합니다.
SwitchMap
val userIdLiveData:MutableLiveData = ...;
val userLiveData:LiveData = Transformations.switchMap(userIdLiveData, id ->
repository.getUserById(id)); // LiveData를 리턴합니다.
fun setUserId(userId:String) {
this.userIdLiveData.setValue(userId);
}
SwitchMap은 데이터의 인자값에 따라 다른 LiveData를 발행합니다. repository.getUserById(id)는 RoomDatabase에서 ID값에 따라 유저값을 가져오며 return값이 LiveData입니다. SwitchMap을 잘보면 LiveData값을 리턴하고있습니다. 따라서 인자값에따라 다른 데이터소스를 보낼 수 있습니다.
MediatorLiveData
val liveData1:LiveData = ...;
val liveData2: LiveData = ...;
val liveDataMerger:MediatorLiveData = new MediatorLiveData<>();
liveDataMerger.addSource(liveData1, value -> liveDataMerger.setValue(value));
liveDataMerger.addSource(liveData2, value -> liveDataMerger.setValue(value));
여러 데이터 소스를 한곳에서 Observe할때 사용을합니다. 예를들어 Fragment별로 LiveData<Error>가 있고 이걸 Activity 한곳에서 Crashlistic에 기록한다거나 Toast메세지를 띄울때 Fragment의 LiveData를 Activity의 MediatorLiveData를 통해 사용할 수 있습니다.
참고
https://www.youtube.com/watch?v=2rO4r-JOQtA Fun With LiveData
https://www.youtube.com/watch?v=OMcDk2_4LSk Android Jetpack:LiveData
'Android > LiveData' 카테고리의 다른 글
LiveData 사용의 이점 (0) | 2021.04.16 |
---|