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自己實現(xiàn)了 LifecycleObserver的類);//需要繼承androidx的 CompatActivity 的子類

原理

  1. getLifecycle().addObserver(xx) 里面會保存自己implements LifecycleObserver 中的注解標(biāo)記了生命周期的函數(shù)
  2. 類似Glide 提供了個空的fragment ;在ReportFragment中,生命周期函數(shù)用狀態(tài)機制做了處理
  3. 狀態(tài)機制:記錄了mState, mActive;猜測狀態(tài)機制的原因,方便別的框架用。
  4. 用反射去調(diào)用1中記錄的函數(shù)

Livedata

有生命周期管理的數(shù)據(jù),內(nèi)部用了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. 發(fā)送變更消息
xxModel.xx的單例.setValue("xx");//主線程,子線程用postValue("xxxx")
  1. LiveData 還有個使用方法是用LiveDataBus 通過一個map來處理,一個單例,都注冊到map里面,用的時候直接用。

原理

  1. observer 進(jìn)入,使用LifecycleBoundObserver 包裝給wrapper作為觀察者
  2. 使用setValue通知觀察者(postValue實際是到主線程用setValue)
  3. setValue中 dispatchingvalue()循環(huán)處理消息發(fā)送,considerNotify具體的通知操作:里面有mActive,mversion mLastversion 3個變量;
  4. mActive,表示在界面顯示才做操作
  5. mversion,mlastversion 是用來計算發(fā)送的情況,setvalue一次mversion會自加;這里會有粘連情況,比如先setvalue,再注冊observer依然會收到消息。要解決此 問題得用hook 改掉源碼里面的這兩個變量第一次使用使其相等即可。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容