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);
解决方案:
- 使用不同的数据 ,不同的livedata
2.不多次注册,观察者回调中根据条件判断进行不同处理
3.重写liveData, 自定义Observer,重写onStateChanged方法进行拦截
4.重写liveData, observe方法中反射修改mLastVersion值,设置等于mVersion.
ViewModel + LiveData 使用 TODO: