非粘性LiveData-NonStickyLiveData

實(shí)現(xiàn)非粘性的LiveData
https://github.com/WLHere/Snippet/blob/master/util/NonStickyLiveData.java

public class NonStickyLiveData<T> extends LiveData<T> {
    private ConcurrentHashMap<Observer, ObserverWrapper> observerMapping = new ConcurrentHashMap<>();

    @Override
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
        super.observe(owner, wrap(observer));
    }

    @Override
    public void observeForever(@NonNull Observer<? super T> observer) {
        super.observeForever(wrap(observer));
    }

    @Override
    public void removeObserver(@NonNull Observer<? super T> observer) {
        ObserverWrapper wrapper = observerMapping.remove(observer);
        if (wrapper != null) {
            super.removeObserver(wrapper);
        } else {
            super.removeObserver(observer);
        }
    }

    @Override
    public void postValue(T value) {
        super.postValue(value);
    }

    @Override
    public void setValue(T value) {
        super.setValue(value);
    }

    private Observer wrap(Observer<? super T> observer) {
        ObserverWrapper proxyObserver = observerMapping.get(observer);
        if (proxyObserver == null) {
            proxyObserver = new ObserverWrapper(observer);
            observerMapping.put(observer, proxyObserver);
        }
        return proxyObserver;
    }

    /**
     * 包裝observer??梢院雎缘谝淮蔚膐nChanged回調(diào)
     * @param <T>
     */
    private class ObserverWrapper<T> implements Observer<T> {
        private final Observer targetObserver;
        private boolean ignoreOnce;

        public ObserverWrapper(Observer targetObserver) {
            this.targetObserver = targetObserver;
            this.ignoreOnce = getValue() != null;
        }

        @Override
        public void onChanged(T t) {
            if (ignoreOnce) {
                ignoreOnce = false;
            } else {
                targetObserver.onChanged(t);
            }
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容