Single Live Event (LiveData가 1번만 쓰이는 이벤트)

sooj·2023년 12월 8일
0

.android

목록 보기
16/18

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
    }
}

1. AtomicBoolean(false)

멀티쓰레딩 환경에서 동시성 보장하는 AtomicBoolean.
false 로 초기화 되어있음


2. override fun observe 함수

  1. 뷰가 활성화 상태 or setValue 값이 바뀌었을 때 호출되는 observe 함수

  2. pending 변수가 true 면 if문 내의 로직을 처리하고 false 로 바뀜

  3. setValue 통해서만 pending 값이 true로 바뀌므로 ->
    Configuration Changed 가 일어나도 pending 값은 false 이기에
    observe가 데이터 전달 X


    3. setValue 함수

    1 . LiveData로써 들고 있는 데이터의 값을 변경하는 함수
    2 . 여기서 pending(AtomicBoolean)의 변수는 true 로 바꾸어서
    3 . observe 내에 if문 처리하도록


    4. call 함수

    데이터의 속성을 지정 안해줘도 call 만으로 setValue 호출 가능 wow

profile
하루하루는 성실하게 인생 전체는 되는대로

0개의 댓글

관련 채용 정보