关于 mLastVersion 疑问

来源:9-1 LiveData优雅的实现事件总线【难点】

慕慕6500093

2022-11-27

if (mLastVersion >= mLiveData.mVersion) {
    if (mSticky && mLiveData.mStickyData != null) {
        mObserver.onChanged(mLiveData.mStickyData);
    }
    return;
}

这里我的理解是:原来包装过的liveData已经发射给了所有已注册的observe(因为包装过的liveData的发射次数至少等于我们自己记录的次数), 如果再来新的observer,那么判断下是否为粘性事件,如果是粘性事件则处理,反之不处理。

mLastVersion = mLiveData.mVersion;// 记录包装过的liveData的发射次数
mObserver.onChanged(t);

疑问:尽管mVersion和mLastVersion是我们自己定义的,但我认为mLastVersion只会小于或等于mLiveData.mVersion,而不会出现mLastVersion大于mLiveData.mVersion的情况,因为mLiveData.mVersion只要调用setValue/postValue发射就会立即+1更新,而mLastVersion也仅仅是通过mLiveData.mVersion赋值才会更新。?

另外,LiveDataBus 通过过滤事件名拿到对应的包装过的livedata,然后注册observer,似乎少了一步反注册removeObserver流程?

写回答

1回答

LovelyChubby

2022-11-28

LiveDataBus监听了宿主的onDestory事件,进行了反注册。对使用方更为友好
0
1
慕慕6500093
1. 找到了,是livedata内部进行了反注册,谢谢 @Override public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) { if (mOwner.getLifecycle().getCurrentState() == DESTROYED) { removeObserver(mObserver); return; } activeStateChanged(shouldBeActive()); } LifecycleRegistry.dispatchEvent(LifecycleOwner, Event) —> onStateChanged —> activeStateChanged —> dispatchingValue 也就是在onStateChanged进行了拦截 2. 麻烦老师回复一下 mLastVersion 的问题,谢谢了
2022-11-28
共1条回复

开发商业级热门短视频App 掌握Jetpack组件库

Jetpack架构大揭秘,全组件实战主流且功能完整的短视频App

1364 学习 · 607 问题

查看课程