LiveData의 별도의 MutableLiveData 하위 클래스가있는 이유는 무엇입니까?
및 메서드를 공개 하는 것만 과 MutableLiveData
는 다른 것처럼 보이지만 보호됩니다.LiveData
setValue()
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);
}
}
그래서 그래, 그 차이는 만들어 제공 postValue
및 setValue
공개.
머리에서 떠 올릴 수있는 한 가지 사용 사례 는 Kotlin의 Backing Property 를 사용하여 캡슐화하는 것 입니다. 클래스 에서 조작 LiveData
할 수 있더라도 조각 / 활동 (UI 컨트롤러)에 노출 할 수 있습니다 .MutableLiveData
ViewModel
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
}
'programing' 카테고리의 다른 글
android logcat 로그 수다스러운 모듈 라인 만료 메시지 (0) | 2021.01.14 |
---|---|
GCC / clang 어셈블리 출력에서 "노이즈"를 제거하는 방법은 무엇입니까? (0) | 2021.01.14 |
GNU C ++ 용 SSE SSE2 및 SSE3 (0) | 2021.01.14 |
게시 된 RDL 파일은 어디에 있습니까? (0) | 2021.01.14 |
동일한 로거에 대해 서로 다른 로그 수준을 서로 다른 파일에 기록하도록 log4j를 구성하는 방법 (0) | 2021.01.14 |