android开源框架27Lifecycle|LiveData

Lifecycle

借鉴的Glide生命周期管理

使用

  1. 要用的地方implements LifecycleObserver
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
void onxxx(LifecycleOwner owner){}

@OnLifecycleEvent(Lifecycle.Event.ON_START)
void onxxxx(LifecycleOwner owner)
...
  1. 在Activity的onCreate里面添加 getLifecycle().addObserver(xx自己实现了 LifecycleObserver的类);//需要继承androidx的 CompatActivity 的子类

原理

  1. getLifecycle().addObserver(xx) 里面会保存自己implements LifecycleObserver 中的注解标记了生命周期的函数
  2. 类似Glide 提供了个空的fragment ;在ReportFragment中,生命周期函数用状态机制做了处理
  3. 状态机制:记录了mState, mActive;猜测状态机制的原因,方便别的框架用。
  4. 用反射去调用1中记录的函数

Livedata

有生命周期管理的数据,内部用了Lifecycle

使用

  1. ViewModel中定义
public class XxViewModel extends ViewModel{
  private MutableLiveData<String> xx;
  //单例get
}
  1. 定义观察者
Observer xxObserver= new Observer<String>(){
@override
public void onChanged(String s){
  xx.setText(s);
}
}
  1. 初始化和订阅
xxModel = ViewModelProviders.of(this).get(xxViewModel.class);
xxModel.xx的单例.observer(this,xxObserver);
  1. 发送变更消息
xxModel.xx的单例.setValue("xx");//主线程,子线程用postValue("xxxx")
  1. LiveData 还有个使用方法是用LiveDataBus 通过一个map来处理,一个单例,都注册到map里面,用的时候直接用。

原理

  1. observer 进入,使用LifecycleBoundObserver 包装给wrapper作为观察者
  2. 使用setValue通知观察者(postValue实际是到主线程用setValue)
  3. setValue中 dispatchingvalue()循环处理消息发送,considerNotify具体的通知操作:里面有mActive,mversion mLastversion 3个变量;
  4. mActive,表示在界面显示才做操作
  5. mversion,mlastversion 是用来计算发送的情况,setvalue一次mversion会自加;这里会有粘连情况,比如先setvalue,再注册observer依然会收到消息。要解决此 问题得用hook 改掉源码里面的这两个变量第一次使用使其相等即可。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。