美文网首页
LifeCircle使用

LifeCircle使用

作者: 小虫虫奇遇记 | 来源:发表于2021-10-01 21:40 被阅读0次

MVP可以使用LifeCircle解耦。
不用在Activity生命周期中再调用Presenter的生命周期回调。
Presenter实现DefaultLifecycleObserver,在Activity或fragment中通过
getLifecycle().addObserver(presenter)就实现Presenter监听Activity生命周期。

LiveData能避免内存泄漏的根本原因是它与Lifecycles绑定,在非活跃状态时移除观察者,而Activity和Fragment都是LifecycleOwner,所以在Activity和Fragment中,不用对LiveData进行销毁。

//数据更新原理:setValue时调用观察者
observer.mObserver.onChanged((T) mData);

// 内部类 LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver {
  @Override
        public void onStateChanged(@NonNull LifecycleOwner source,
                @NonNull Lifecycle.Event event) {
            Lifecycle.State currentState = mOwner.getLifecycle().getCurrentState();
            if (currentState == DESTROYED) {
                removeObserver(mObserver);
                return;
            }
            Lifecycle.State prevState = null;
            while (prevState != currentState) {
                prevState = currentState;
                activeStateChanged(shouldBeActive());
                currentState = mOwner.getLifecycle().getCurrentState();
            }
        }

livedata粘性事件:

先修改数据 再添加观察者,依然可以收到通知。
每次注册时都new ObserverWrapper (): mLastVersion =-1
setValue时 mVersion++
事件分发时

 //一般事件流程 :new Observe(mVersion=-1)-> 注册观察者(mLastVersion=-1)-> setValue(mVersion++) 
        //粘性事件的流程 :new Observe(mVersion=-1)-> setValue(mVersion++) ->注册观察者(mLastVersion=-1)
        //此时 mLastVersion=-1 , mVersion=0 ,未触发拦截导致首次注册时会触发接口回调造成粘性事件
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
         //每次addObserver都new LifecycleBoundObserver
        LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
        owner.getLifecycle().addObserver(wrapper);
    }
//LifecycleBoundObserver::onStateChanged
 if (observer.mLastVersion >= mVersion) {
            return;
        }
        observer.mLastVersion = mVersion;
        //noinspection unchecked
        observer.mObserver.onChanged((T) mData);

解决方案:

  1. 使用不同的数据 ,不同的livedata
    2.不多次注册,观察者回调中根据条件判断进行不同处理
    3.重写liveData, 自定义Observer,重写onStateChanged方法进行拦截
    4.重写liveData, observe方法中反射修改mLastVersion值,设置等于mVersion.

ViewModel + LiveData 使用 TODO:

image.png

相关文章

网友评论

      本文标题:LifeCircle使用

      本文链接:https://www.haomeiwen.com/subject/hprgbktx.html