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自己實現(xiàn)了 LifecycleObserver的類);//需要繼承androidx的 CompatActivity 的子類
原理
- getLifecycle().addObserver(xx) 里面會保存自己implements LifecycleObserver 中的注解標(biāo)記了生命周期的函數(shù)
- 類似Glide 提供了個空的fragment ;在ReportFragment中,生命周期函數(shù)用狀態(tài)機制做了處理
- 狀態(tài)機制:記錄了mState, mActive;猜測狀態(tài)機制的原因,方便別的框架用。
- 用反射去調(diào)用1中記錄的函數(shù)
Livedata
有生命周期管理的數(shù)據(jù),內(nèi)部用了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);
- 發(fā)送變更消息
xxModel.xx的單例.setValue("xx");//主線程,子線程用postValue("xxxx")
- LiveData 還有個使用方法是用LiveDataBus 通過一個map來處理,一個單例,都注冊到map里面,用的時候直接用。
原理
- observer 進(jìn)入,使用LifecycleBoundObserver 包裝給wrapper作為觀察者
- 使用setValue通知觀察者(postValue實際是到主線程用setValue)
- setValue中 dispatchingvalue()循環(huán)處理消息發(fā)送,considerNotify具體的通知操作:里面有mActive,mversion mLastversion 3個變量;
- mActive,表示在界面顯示才做操作
- mversion,mlastversion 是用來計算發(fā)送的情況,setvalue一次mversion會自加;這里會有粘連情況,比如先setvalue,再注冊observer依然會收到消息。要解決此 問題得用hook 改掉源碼里面的這兩個變量第一次使用使其相等即可。