본문 바로가기
Development/Android

Android - Deep dive into LiveData - 4. MediatorLiveData

by du.it.ddu 2023. 4. 1.
반응형

 이전 포스팅에서 Transformations를 사용하여 LiveData를 다른 LiveData로 변화시켰다.
이번 포스팅은 Transformations 내부에서 사용한 MediatorLiveData에 대해 알아본다.

https://developer.android.com/reference/android/arch/lifecycle/MediatorLiveData

 

MediatorLiveData  |  Android Developers

Stay organized with collections Save and categorize content based on your preferences. The android.arch Architecture Components packages are no longer maintained. They have been superseded by the corresponding androidx.* packages. See androidx.lifecycle.Me

developer.android.com

MediatorLiveData는 중재자 LiveData로,
여러가지 LiveData들의 변화를 감지하여 하나의 값을 방출한다.

예를들어 다수의 입력필드가 있고, 입력필드들의 값을 검증하여 어떤 버튼이 활성화된다고 해보자.
이 경우, 검증해야할 모든 LiveData의 값을 구독하여 버튼을 활성화 시켜야 될까?
그럼 너무 지저분해지고, 실수할 가능성도 높아진다.
이럴때 MediatorLiveData를 사용하면 손쉽게 해결할 수 있다.

아래 예시 코드를 보자.

class MyViewModel: ViewModel() {
    private val _input1: MutableLiveData<String> = MutableLiveData()
    private val _input2: MutableLiveData<String> = MutableLiveData()
    private val _input3: MutableLiveData<String> = MutableLiveData()
    
    private val _buttonEnable: MediatorLiveData<Boolean> = MediatorLiveData().apply {
        value = false
        
        addSource(_input1) {
            value = it.isNotEmpty() && !_input2.value.isNullOrEmpty() && !_input3.value.isNullOrEmpty()
        }
        addSource(_input2) {
            value = it.isNotEmpty() && !_input1.value.isNullOrEmpty() && !_input3.value.isNullOrEmpty()
        }
        addSource(_input3) {
            value = it.isNotEmpty() && !_input1.value.isNullOrEmpty() && !_input2.value.isNullOrEmpty()
        }
    }
    val buttonEnable: LiveData<Boolean> = _buttonEnable
}

class NameActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        viewModel.buttonEnable.observe(this) {
            myButton.isEnabled = it
        }
    }
}

3개의 입력필드가 있다고 가정해보자.
그리고 3개의 입력필드가 모두 입력값이 있을때 버튼이 활성화 되어야 하는 조건이 있다.
MediatorLiveData에 입력 필드들의 LiveData를 Source로 등록한다.
그리고 각 Source의 변화가 감지되었을 때 MediatorLiveData의 value를 어떻게 변화시킬건지 작성한다.

이렇게 되면, 각 Source가 변화되었을 때 마다 MediatorLiveData의 값이 변하고,
Activity/Fragment에서는 이 MediatorLiveData만 관찰하여 버튼의 활성화 상태를 변경할 수 있다.

이처럼 다수의 LiveData의 값을 감지하여 하나의 값으로 정제해야 하는 경우에,
MediatorLiveData는 매우 활용도가 높다.

반응형