Lifecycle
借鉴的Glide生命周期管理
使用
- 要用的地方implements LifecycleObserver
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
void onxxx(LifecycleOwner owner){}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
void onxxxx(LifecycleOwner owner)
...
- 在Activity的onCreate里面添加 getLifecycle().addObserver(xx自己实现了 LifecycleObserver的类);//需要继承androidx的 CompatActivity 的子类
原理
- getLifecycle().addObserver(xx) 里面会保存自己implements LifecycleObserver 中的注解标记了生命周期的函数
- 类似Glide 提供了个空的fragment ;在ReportFragment中,生命周期函数用状态机制做了处理
- 状态机制:记录了mState, mActive;猜测状态机制的原因,方便别的框架用。
- 用反射去调用1中记录的函数
Livedata
有生命周期管理的数据,内部用了Lifecycle
使用
- ViewModel中定义
public class XxViewModel extends ViewModel{
private MutableLiveData<String> xx;
//单例get
}
- 定义观察者
Observer xxObserver= new Observer<String>(){
@override
public void onChanged(String s){
xx.setText(s);
}
}
- 初始化和订阅
xxModel = ViewModelProviders.of(this).get(xxViewModel.class);
xxModel.xx的单例.observer(this,xxObserver);
- 发送变更消息
xxModel.xx的单例.setValue("xx");//主线程,子线程用postValue("xxxx")
- LiveData 还有个使用方法是用LiveDataBus 通过一个map来处理,一个单例,都注册到map里面,用的时候直接用。
原理
- observer 进入,使用LifecycleBoundObserver 包装给wrapper作为观察者
- 使用setValue通知观察者(postValue实际是到主线程用setValue)
- setValue中 dispatchingvalue()循环处理消息发送,considerNotify具体的通知操作:里面有mActive,mversion mLastversion 3个变量;
- mActive,表示在界面显示才做操作
- mversion,mlastversion 是用来计算发送的情况,setvalue一次mversion会自加;这里会有粘连情况,比如先setvalue,再注册observer依然会收到消息。要解决此 问题得用hook 改掉源码里面的这两个变量第一次使用使其相等即可。