反注册(LiveData的反注册生命周期)

LifecycleBoundObserver 中提供了一个 detachObserver() 方法,只有这个方法里面,会进行生命周期的反注册功能。

@MainThread
public void removeObserver(@NonNull final Observer<? super T> observer) {
//判断如果不是主线程则抛异常
assertMainThread("removeObserver");

//mObservers 是属于这个 LiveData 的观察者集合,需要从集合里删除这个观察者
ObserverWrapper removed = mObservers.remove(observer);
if (removed == null) {
return;
}

//这个 removed 变量的声明是 ObserverWrapper 类型。这是个抽象类,无法实例化。
//实际只能是 AlwaysActiveObserver 或者 LifecycleBoundObserver 两种类型。
//1.如果是 AlwaysActiveObserver 类型,没有重写 detachObserver() 方法。
//因为这是属于 observeForever 的逻辑,永久观察当然不用处于声明周期方面的功能。
//2.如果是 LifecycleBoundObserver 类型,则重写了 detachObserver() 方法。
//用于让 owner 移除这个观察者。
removed.detachObserver();

//因为移除了一个观察者,可能使得 LiveData 的活跃观察者从1变0,所以需要通知一下。
removed.activeStateChanged(false);
}

@SuppressWarnings("WeakerAccess")
@MainThread
public void removeObservers(@NonNull final LifecycleOwner owner) {
assertMainThread("removeObservers");
for (Map.Entry<Observer<? super T>, ObserverWrapper> entry : mObservers) {
if (entry.getValue().isAttachedTo(owner)) {
removeObserver(entry.getKey());
}
}
}


class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {
@NonNull
final LifecycleOwner mOwner;

@Override
void detachObserver() {
mOwner.getLifecycle().removeObserver(this);
}
}
这里的 detachObserver() 方法在 LiveData.removeObservers(Observer<T>) 和 LiveData.removeObservers(LifecycleOwner) 中调用的。

LiveData.removeObservers(LifecycleOwner) 内部也是调用的 LiveData.removeObservers(Observer<T>)。让我们先捋清楚 removeObserver(Observer<? super T>) 干了些什么事情。

干得四件事如代码注释所写。

那么 LiveData.removeObservers(Observer<T>) 在什么时候调用呢?

LiveData.removeObservers(Observer<T>) 其实是在接受生命周期回调的 onStateChanged(LifecycleOwner, Lifecycle.Event) 方法中,会判断如果是如果当前 owner 处于 DESTROYED 状态就执行。LiveData 是用的此种方法让它具有了自动反注册功能。下面请看 LiveData 如何接受生命周期事件。
————————————————

posted @ 2019-08-19 20:26  李艳艳665  阅读(845)  评论(0编辑  收藏  举报