class SingleLiveEvent<T> : MutableLiveData<T>() {
private val pending = AtomicBoolean(false)
@MainThread
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
// Observe the internal MutableLiveData
super.observe(owner, Observer<T> { t ->
if (pending.compareAndSet(true, false)) {
observer.onChanged(t)
}
})
}
@MainThread
override fun setValue(t: T?) {
pending.set(true)
super.setValue(t)
}
/**
* Used for cases where T is Void, to make calls cleaner.
*/
@MainThread
fun call() {
value = null
}
}
멀티쓰레딩 환경에서 동시성 보장하는 AtomicBoolean.
false 로 초기화 되어있음
뷰가 활성화 상태 or setValue 값이 바뀌었을 때 호출되는 observe 함수
pending 변수가 true 면 if문 내의 로직을 처리하고 false 로 바뀜
setValue 통해서만 pending 값이 true로 바뀌므로 ->
Configuration Changed 가 일어나도 pending 값은 false 이기에
observe가 데이터 전달 X
1 . LiveData로써 들고 있는 데이터의 값을 변경하는 함수
2 . 여기서 pending(AtomicBoolean)의 변수는 true 로 바꾸어서
3 . observe 내에 if문 처리하도록
데이터의 속성을 지정 안해줘도 call 만으로 setValue 호출 가능 wow