在 GenericLifecycleObserver.onStateChanged(LifecycleOwner, Lifecycle.Event) 中能接受到回调

LiveData.java
------------------------------
public abstract class LiveData<T> {

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

@Override
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
removeObserver(mObserver);
return;
}
activeStateChanged(shouldBeActive());
}
}


@MainThread
public void removeObserver(@NonNull final Observer<? super T> observer) {
assertMainThread("removeObserver");
ObserverWrapper removed = mObservers.remove(observer);
if (removed == null) {
return;
}
removed.detachObserver();
removed.activeStateChanged(false);
}



LiveEventBus.java
------------------------------
public final class LiveEventBus {

private class LiveEvent<T> implements Observable<T> {

private class LifecycleLiveData<T> extends ExternalLiveData<T> {
@Override
protected Lifecycle.State observerActiveLevel() {
return lifecycleObserverAlwaysActive ? Lifecycle.State.CREATED : Lifecycle.State.STARTED;
}

@Override
public void removeObserver(@NonNull Observer<? super T> observer) {
super.removeObserver(observer);
if (autoClear && !liveData.hasObservers()) {
LiveEventBus.get().bus.remove(key);
}
}
}
前面讲过在 LiveData 的内部类?LifecycleBoundObserver.onStateChanged 方法中会判断如果当前 state 是 DESTROYED,就删除观察者操作。这个要删除的观察者 Observer 是 LiveData 的所包裹的数据的观察者。

具体在 LiveData 代码的逻辑是,把这个observer 从 mObservers集合(LiveData 所缓存的一份观察者列表)?中移除。

?

 

对应到我们 LiveEventBus ,就是我们使用 LiveEventBus 传进去的 Observer 回调函数给移除了。

这样就实现了「自动取消订阅」的效果。


?

还有LiveEventBus声称具有「整个生命周期(从onCreate到onDestroy)都可以实时收到消息」能力,那么怎么实现的呢?

ps:这算值得写出来的能力吗?这不是一个正常的事件总线应有的能力吗?

ExternalLiveData.java
------------------------------
public class ExternalLiveData<T> extends MutableLiveData<T> {

protected Lifecycle.State observerActiveLevel() {
return CREATED;
}

class ExternalLifecycleBoundObserver extends LifecycleBoundObserver {

ExternalLifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<? super T> observer) {
super(owner, observer);
}

@Override
boolean shouldBeActive() {
return mOwner.getLifecycle().getCurrentState().isAtLeast(observerActiveLevel());
}
}



LiveEventBus.java
------------------------------
public final class LiveEventBus {

private boolean lifecycleObserverAlwaysActive = true;

private class LifecycleLiveData<T> extends ExternalLiveData<T> {
@Override
protected Lifecycle.State observerActiveLevel() {
return lifecycleObserverAlwaysActive ? Lifecycle.State.CREATED : Lifecycle.State.STARTED;
}



LiveData.java
------------------------------
public abstract class LiveData<T> {


class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {

@Override
boolean shouldBeActive() {
return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
}
原生 LiveData.java 使用了?LifecycleBoundObserver,所以在判定是否活跃的这个 shouldBeActive() 方法中,owner 的生命周期 state ≥?STARTED 才会认为是活跃。即?STARTED 和?RESUMED。符合 MVVM 的特性,可见的界面才有必要更新UI。

LiveEventBus 如果使用这个策略是不太合理的,所以重写了?shouldBeActive() 方法,让它判断逻辑是≥CREATED(LiveEventBus的默认情况)即认为是活跃。达到了官网宣称的「整个生命周期(从onCreate到onDestroy)都可以实时收到消息」效果。
————————————————

posted @ 2019-08-20 18:07  水至清明  阅读(633)  评论(0编辑  收藏  举报