postValue와 setValue의 차이점은 아시리라 생각합니다. recap하면,
postValue - 쓰레드에 안전하게 데이터를 전달할 수 있다. 이 메소드를 사용하면 데이터는 먼저 큐에 쌓이고 나서 후에 처리된다. 만약 아직 큐에 데이터가 존재할 때, 다른 데이터가 들어오면 기존 데이터는 무시되고 나중의 데이터만 보관된다.
setValue - 메인쓰레드에서만 사용할 수 있다. 메인쓰레가 아닌 곳에서 사용하면 에러가 발생한다. 이 메소드를 이용하면 대기없이 데이터가 바로 전송된다.
한쪽에서 setValue를 하고 다른 곳에서 getValue로 값을 읽어오게 되면 위에 설명드린 부분때문에 null이 리턴될 수 있습니다. 해결책은 말씀하신 대로 setValue를 하시는 것이 가장 간단한 해결책일 듯 합니다. 다른 옵션으로는 데이터를 캐시를 하고 캐시를 공유할 수도 있습니다.
살짝 트릭을 사용하면, 이런 방법도 사용할 수 있습니다. 딱히 권하고는 싶지 않지만, 꼭 필요하시다면 검토해 보세요.
class BackeValueMutableLiveData(initialValue: T?): MutableLiveData<T>(initialValue) {
private var backedValue: T? = initialValue
override fun setValue(value: T?) {
backedValue = value
super.postValue(value)
}
override fun setValue(value: T?) {
backedValue = value
super.setValue(value)
}
override fun getValue(): T? {
return supert.getValue() ?: backedValue
}
}