programing

LiveData의 별도의 MutableLiveData 하위 클래스가있는 이유는 무엇입니까?

yoursource 2021. 1. 14. 23:27
반응형

LiveData의 별도의 MutableLiveData 하위 클래스가있는 이유는 무엇입니까?


메서드를 공개 하는 것만 MutableLiveData는 다른 것처럼 보이지만 보호됩니다.LiveDatasetValue()postValue()LiveData

이러한 변경을 위해 별도의 클래스를 만들고 해당 메서드를 LiveData그 자체 로 공용으로 정의하지 않는 이유는 무엇입니까 ?

일반적으로 말해서, 그러한 상속 형태 (특정 메서드의 가시성을 높이는 것이 유일한 변경 사항 임)는 잘 알려진 관행이며 유용 할 수있는 시나리오는 무엇입니까 (모든 코드에 액세스 할 수 있다고 가정)?


에서 LiveData - 안드로이드 개발자 용 문서 , 당신을 위해 그것을 볼 수 있습니다 LiveData, setValue()postValue()방법은 공개되지 않습니다.

반면 MutableLiveData-Android Developer Documentation 에서는 내부적으로 MutableLiveData확장 LiveData되고의 두 가지 매직 메서드 LiveData공개적으로 사용 가능하며 setValue()& postValue()입니다.

setValue(): 값을 설정하고 모든 활성 관찰자에게 값을 전달하며, 주 스레드 에서 호출해야합니다 .

postValue(): 작업을 메인 스레드에 게시하여에서 설정 한 값을 무시 setValue()하고 백그라운드 스레드 에서 호출해야합니다 .

따라서, LiveData이다 불변 . MutableLiveData이다 LiveData가변스레드 안전 .


다음은 전체 MutableLiveData.java파일입니다.

package androidx.lifecycle;
/**
 * {@link LiveData} which publicly exposes {@link #setValue(T)} and {@link #postValue(T)} method.
 *
 * @param <T> The type of data hold by this instance
*/
@SuppressWarnings("WeakerAccess")
public class MutableLiveData<T> extends LiveData<T> {
    @Override
    public void postValue(T value) {
        super.postValue(value);
    }
    @Override
    public void setValue(T value) {
        super.setValue(value);
    }
}

그래서 그래, 그 차이는 만들어 제공 postValuesetValue공개.

머리에서 떠 올릴 수있는 한 가지 사용 사례 는 Kotlin의 Backing Property사용하여 캡슐화하는 것 입니다. 클래스 에서 조작 LiveData할 수 있더라도 조각 / 활동 (UI 컨트롤러)에 노출 할 수 있습니다 .MutableLiveDataViewModel

    class TempViewModel : ViewModel() {
        ...
        private val _count = MutableLiveData<Int>()
        val count: LiveData<Int>
            get() = _count
        public fun incrementCount() = _score.value?.plus(1)
        ...
    }

이렇게하면 UI 컨트롤러가 값을 편집 할 수없는 상태에서만 관찰 할 수 있습니다. 분명히 UI 컨트롤러는 TempViewModel같은 공개 메서드를 사용하여 값을 편집 할 수 있습니다 incrementCount().

참고 : 변경 가능 / 불변 혼란을 명확히하기 위해-

data class User(var name: String, var age: Int)

class DemoLiveData: LiveData<User>()

var demoLiveData: LiveData<User>? = DemoLiveData()

fun main() {
    demoLiveData?.value = User("Name", 23) // ERROR
    demoLiveData?.value?.name = "Name" // NO ERROR
    demoLiveData?.value?.age = 23  // NO ERROR
}

참조 URL : https://stackoverflow.com/questions/46814158/why-theres-a-separate-mutablelivedata-subclass-of-livedata

반응형