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) {
// 判断是否有活动的Observer
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.");
}
// 新建一个Observer来监听
super.observe(owner, new Observer<T>() {
@Override
public void onChanged(@Nullable T t) {
// 当mPending为true的时候,才能触发onChanged,同时设置 mPending为false
if (mPending.compareAndSet(true, false)) {
observer.onChanged(t);
}
}
});
}
@MainThread
public void setValue(@Nullable T t) {
// 只有赋值的时候mPending才会变成true
mPending.set(true);
super.setValue(t);
}
}
关键思想是,触发onChanged同时设置mPending标志位,所以同一次赋值操作,只可能触发一次onChanged。