본문 바로가기

Android/이론

[안드로이드] MediatorLiveData를 이용하여 여러개의 LiveData를 하나의 LiveData로 합치기

728x90
반응형
SMALL

 

Next 버튼의 활성화/비활성화를 LiveData로 만들고 싶은데,

이에 영향을 주는 LiveData가 2개 이상입니다.

MediatorLiveData를 사용하면 여러개의 LiveData를 다시 mapping할 수 있습니다. 

저는 무려 4개였습니다 ..ㅎㅎ

 

class MyViewModel(private val repository: Repository): ViewModel() {

    val emg1Connected: LiveData<Boolean> = repository.deviceEmg1.connected
    val emg2Connected: LiveData<Boolean> = repository.deviceEmg2.connected

    val emg1Calibrated: LiveData<Boolean> = repository.deviceEmg1.calibrated
    val emg2Calibrated: LiveData<Boolean> = repository.deviceEmg2.calibrated
    
}

 

이 4개의 LiveData를 하나의 LiveData로 합쳐보겠습니다.

val onNext: MediatorLiveData<Boolean> = MediatorLiveData()

먼저 합칠 MediatorLiveData를 만들어줍니다.

 

Next Button에 바인딩할 LiveData를 만들어야 합니다. (활성,비활성을 실시간으로 업데이트해야합니다.)

이제 여기에 source를 추가해주면됩니다. (단, 하나하나 해야합니다.)

저는 4개의 LiveData를 받아야하므로..

val onNext: MediatorLiveData<Boolean> = MediatorLiveData()

init{
    onNext.addSource(emg1Calibrated) {
        onNext.value = _onNext()
    }
    onNext.addSource(emg2Calibrated) {
        onNext.value = _onNext()
    }
    onNext.addSource(emg1Connected) {
        onNext.value = _onNext()
    }
    onNext.addSource(emg2Connected) {
         onNext.value = _onNext()
    }
}

이렇게 LiveData를 업데이트 해주면 됩니다.

 

 private fun _onNext():Boolean {
   if((emg1Connected.value==true) and (emg2Connected.value == true)){
        return (emg1Calibrated.value) or (emg2Calibrated.value)
   }else if(emg1Connected.value == true){
        return emg1Calibrated.value
   }else if(emg2Connected.value == true){
        return emg2Calibrated.value
   }
   return false
}

각각의 LiveData의 값에 맞게 도출되는 값을 반환하는 메서드를 만들었습니다. 

이 메서드에 의해 업데이트 된 변수(onNext)는 LiveData이므로 view에서 observing도 되고 data binding도 됩니다. 

 

간단히 여러개의 LiveData를 mapping하기 위해 MediatorLiveData를 사용할 수 있었습니다. 굿!

 

아래 포스트도 참고해 보세요.

 

 

728x90
반응형
LIST