使用LiveData處理事件
阿新 • • 發佈:2018-12-10
今天遇到了一件奇怪的事情,在同事手機上有個Activity(A)關閉後竟然又被建立了,除錯後發現原來每次關閉這個Activity(A)都會觸發上一個Activity(B)的生命週期改變,然後在訂閱的LiveData物件會收到OnChange訊息建立Activity(A),正常情況下,這種資料我們只需要處理一次,準確的來講就是事件,這種情況下我們可以使用下面的SingleLiveEvent來處理。
package com.example.android.architecture.blueprints.todoapp; import android.arch.lifecycle.LifecycleOwner; import android.arch.lifecycle.MutableLiveData; import android.arch.lifecycle.Observer; import android.support.annotation.MainThread; import android.support.annotation.Nullable; import android.util.Log; import java.util.concurrent.atomic.AtomicBoolean; /** * A lifecycle-aware observable that sends only new updates after subscription, used for events like * navigation and Snackbar messages. * <p> * This avoids a common problem with events: on configuration change (like rotation) an update * can be emitted if the observer is active. This LiveData only calls the observable if there's an * explicit call to setValue() or call(). * <p> * Note that only one observer is going to be notified of changes. */ public class SingleLiveEvent<T> extends MutableLiveData<T> { private static final String TAG = "SingleLiveEvent"; private final AtomicBoolean mPending = new AtomicBoolean(false); @MainThread public void observe(LifecycleOwner owner, final Observer<T> observer) { if (hasActiveObservers()) { Log.w(TAG, "Multiple observers registered but only one will be notified of changes."); } // Observe the internal MutableLiveData super.observe(owner, new Observer<T>() { @Override public void onChanged(@Nullable T t) { if (mPending.compareAndSet(true, false)) { observer.onChanged(t); } } }); } @MainThread public void setValue(@Nullable T t) { mPending.set(true); super.setValue(t); } /** * Used for cases where T is Void, to make calls cleaner. */ @MainThread public void call() { setValue(null); } }