源碼分析:JetPacks之Lifecycles原理
應(yīng)用:JetPacks之?dāng)?shù)據(jù)傳遞工具
聯(lián)系:JetPack之 LifeCycle LiveData
Lifecycle
- Lifecycle可以有效的避免內(nèi)存泄漏和解決android生命周期的常見難題
- Lifecycle 是一個(gè)表示android生命周期及狀態(tài)的對(duì)象
- LivecycleOwner 用于連接有生命周期的對(duì)象亏吝,如activity,fragment
- LivecycleObserver 用于觀察查L(zhǎng)ifecycleOwner
基本使用
Lifecycle框架使用觀察者模式實(shí)現(xiàn)觀察者監(jiān)聽被觀察者的生命周期的變化
定義被觀察者>>
通過(guò)實(shí)現(xiàn)LifecycleOwner接口
如上圖:我們使用activity不需要再自己寫實(shí)現(xiàn)接口的代碼
定義觀察者>>
通過(guò)實(shí)現(xiàn)LifecycleObserver接口
通過(guò)注解在觀察者類中定義需要監(jiān)聽的生命周期
注:以下方法都會(huì)在被觀察者生命周期變化時(shí)調(diào)用
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
void onCreateX(LifecycleOwner owner) {
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
void onStartX(LifecycleOwner owner) {
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
void onStop(LifecycleOwner owner) {
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
void onResume(LifecycleOwner owner) {
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
void onPause(LifecycleOwner owner) {
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
void onDestory(LifecycleOwner owner) {
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
void onAny(LifecycleOwner owner) {
}
完成訂閱關(guān)系>>
在activity中使用
被觀察者.addObserver(觀察者)
getLifecycle().addObserver(presenter);
環(huán)境配置>>
自己引入
dependencies {
implementation "androidx.lifecycle:lifecycle-runtime:2.0.0"
implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
implementation "androidx.lifecycle:lifecycle-common-java8:2.0.0"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.0.0"
}
核心原理
LifecycleRegister#addObserver
看一下LifecycleRegister 類中的addObserver方法這里你會(huì)發(fā)現(xiàn)生成了一個(gè)ObserverWithState,然后放入FastSafeIterableMap里娇掏,這個(gè)類是一個(gè)自定義列表爽哎,用于保存觀察者并可在遍歷期間處理刪除/添加兴垦。
AppCompatActivity
AppCompatActivity 實(shí)現(xiàn)了LifecycleOwner接口,同時(shí)持有實(shí)現(xiàn)了Lifecycle的LifecycleRegistry對(duì)象,這個(gè)對(duì)象就可以將其理解為觀察者模式中的Observable橙依,LifecycleRegistr聚合多個(gè)LifecycleObserver枣接,生命周期改變時(shí)通知LifecycleObserver進(jìn)行相應(yīng)的方法調(diào)用颂暇。
-
ReportFragment
Commponent#ReportFragment.injectIfNeededIn
AppCompatActivity 繼承的extends androidx.core.app.ComponentActivity中的onCretae方法ReportFragment.injectIfNeededIn(this);
就是在當(dāng)前的Activity里添加一個(gè)ReportFragment。
ReportFragment#dispatch()
再看ReportFragment的生命周期函數(shù)
你會(huì)發(fā)現(xiàn)都調(diào)用了dispatch()方法但惶,
LifecycleRegistry#handleLifecycleEvent
而dispatch()方法則會(huì)判斷Activity是否實(shí)現(xiàn)了LifecycleOwner接口耳鸯,如果實(shí)現(xiàn)了該接口就調(diào)用LifecycleRegister的handleLifecycleEvent()
這樣生命周期的狀態(tài)就會(huì)借由LifecycleRegistry通知給各個(gè)LifecycleObserver從而調(diào)用其中對(duì)應(yīng)Lifecycle.Event的方法。這種通過(guò)Fragment來(lái)感知Activity生命周期的方法其實(shí)在Glide的中也是有體現(xiàn)的膀曾。
handleLifecycleEvent--->getStateAfter
回到handleLifecycleEvent方法中
State next = getStateAfter(event);
事件發(fā)生的時(shí)候县爬,先得到當(dāng)前activity應(yīng)該出現(xiàn)的下一個(gè)狀態(tài)
狀態(tài)機(jī)流轉(zhuǎn)
moveToState(next);
mState = next;更新現(xiàn)在的狀態(tài)
sync();
backwardPass(lifecycleOwner);逆推
forwardPass(lifecycleOwner);
forwardPass(lifecycleOwner)
forwardPass(lifecycleOwner)方法中的細(xì)節(jié)
ObserverWithState observer = entry.getValue();
找到ObserverWithState 類
調(diào)用mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
生成觀察者適配器
onStateChanged
接下來(lái)就是調(diào)用onStateChanged(),來(lái)通知 實(shí)現(xiàn)了 LifecycleObserver的類,生命周期發(fā)生了變化
ReflectiveGenericLifecycleObserver
查看實(shí)現(xiàn)類
ReflectiveGenericLifecycleObserver添谊。onStateChanged()
ReflectiveGenericLifecycleObserver财喳。的構(gòu)造方法中就把presenter中的方法和注解保存了下來(lái)
再通過(guò)onStateChanged()進(jìn)行生命周期的方法的調(diào)用
源碼分析 JetPacks之Lifecycles原理
應(yīng)用 JetPacks之?dāng)?shù)據(jù)傳遞工具
Demo JetPack之 LifeCycle LiveData
LiveData
LiveData是一種具有生命周期感知能力的可觀察數(shù)據(jù)持有類
LiveData可以保證屏幕上的顯示內(nèi)容和數(shù)據(jù)一直保持同步
特點(diǎn):
1.LiveData了解UI界面的狀態(tài),如果activity不在屏幕上顯示斩狱,livedata不會(huì)觸發(fā)沒必要的界面更新耳高,如果activity已經(jīng)被銷毀,會(huì)自動(dòng)清空與observer的連接所踊,意外的調(diào)用就不會(huì)發(fā)生
2.LiveData是一個(gè)LifecycleOwner,他可以直接感知activity或fragment的生命周期
基本使用
定義LifeData >>
項(xiàng)目中l(wèi)ivedata一般都存放在ViewModel中祝高,以保證app配置變更時(shí),數(shù)據(jù)不會(huì)丟失
舉個(gè)例子:
public class NameViewModel extends ViewModel {
public int i = 0;
private MutableLiveData<String> currentName;
public MutableLiveData<String> getCurrentName(){
if(currentName==null){
currentName=new MutableLiveData<>();
}
return currentName;
}
}
使用流程 >>
定義觀察者用以觀察livedata中的數(shù)據(jù)變化
//需要一個(gè)觀察者來(lái)觀察數(shù)據(jù)
Observer observer=new Observer<String>(){
@Override
public void onChanged(String s) {
nameTextView.setText(s);
}
};
livedata訂閱observer
//獲取到viewmodel
model= ViewModelProviders.of(this).get(NameViewModel.class);
//取出livedata完成訂閱
model.getCurrentName().observe(this,observer);
livedata發(fā)送消息通知observer更新數(shù)據(jù)
model.getCurrentName().setValue(anotherName);
以上代碼會(huì)回調(diào)observer中的onChanged方法
使用注意:
setValue只能在主線程運(yùn)行
postValue只能在子線程中運(yùn)行
核心原理
1.observe做為入口>>
使用LifecycleBoundObserver把觀察者和被觀察者包裝在一起
綁定wrapper作為觀察者
綁定完成后污筷,使用setValue與postValue通知觀察者
- setValue中 >>
-------dispatchingValue(null)
if (initiator != null)
參數(shù)傳null和不傳null的區(qū)別就是如果傳null將會(huì)通知所有的觀察者工闺,反之僅僅通知傳入的觀察者乍赫。
for (Iterator<Map.Entry<Observer<? super T>, ObserverWrapper>> iterator =
通知所有的觀察者通過(guò)遍歷 mObservers ,將所有的 ObserverWrapper 拿到陆蟆,實(shí)際上就是我們上面提到的 LifecycleBoundObserver雷厂,通知觀察者調(diào)用considerNotify()方法,這個(gè)方法就是通知的具體實(shí)現(xiàn)了叠殷。
-------considerNotify()
先用2個(gè)if判斷出被觀察者對(duì)應(yīng)的activity狀態(tài)是否為顯示
發(fā)送通知 onChanged()被調(diào)用
- postValue中 >>
切換線程到主線程中去執(zhí)行setValue
LiveDataEventBus
通過(guò)一個(gè)集合統(tǒng)一管理所有的LiveData
設(shè)計(jì)中的BUG:
原來(lái)的執(zhí)行順序new LiveData-->綁定observer-->setValue執(zhí)行onChanged
而我們的BUS在用時(shí)可能出現(xiàn) new LiveData-->setValue執(zhí)行onChanged-->綁定observer
處理方案改鲫,讓第一次setValue不起效即可
LiveDataBus
package top.zcwfeng.jetpack.utils;
import androidx.lifecycle.MutableLiveData;
import java.util.HashMap;
import java.util.Map;
public class LiveDataBus {
//存放訂閱者
private Map<String, MutableLiveData<Object>> bus;
private static LiveDataBus liveDataBus = new LiveDataBus();
private LiveDataBus() {
bus = new HashMap();
}
public static LiveDataBus getInstance() {
return liveDataBus;
}
//注冊(cè)訂閱者
public synchronized <T> MutableLiveData<T> with(String key, Class<T> type) {
if(!bus.containsKey(key)){
bus.put(key,new MutableLiveData<Object>());
}
return (MutableLiveData<T>)bus.get(key);
}
}
LiveDataXBus 解除 LiveDataBus 粘性問題,某些場(chǎng)景需要
/**
* 解除 LiveDataBus 粘性問題林束,某些場(chǎng)景需要
*/
public class LiveDataBusX {
//存放訂閱者
private Map<String, BusMutableLiveData<Object>> bus;
private static LiveDataBusX liveDataBus = new LiveDataBusX();
private LiveDataBusX() {
bus = new HashMap<>();
}
public static LiveDataBusX getInstance() {
return liveDataBus;
}
//注冊(cè)訂閱者像棘,(存入map) Hook前用MutableLiveData
public synchronized <T> BusMutableLiveData<T> with(String key, Class<T> type){
if(!bus.containsKey(key)){
bus.put(key,new BusMutableLiveData<Object>());
}
return (BusMutableLiveData<T>) bus.get(key);
}
public static class BusMutableLiveData<T> extends MutableLiveData<T> {
@Override
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
super.observe(owner, observer);
hook(observer);
}
//在這里去改變onChange的流程
private void hook(Observer<? super T> observer) {
try {
//1.得到mLastVersion
//獲取到LiveData的類中的mObservers對(duì)象
Class<LiveData> liveDataClass = LiveData.class;
Field mObserversField = liveDataClass.getDeclaredField("mObservers");
mObserversField.setAccessible(true);
//獲取到這個(gè)成員變量的對(duì)象
Object mObserversObject = mObserversField.get(this);
//得到map對(duì)應(yīng)的class對(duì)象
Class<?> mObserversClass = mObserversObject.getClass();
//獲取到mObservers對(duì)象的get方法
Method get = mObserversClass.getDeclaredMethod("get", Object.class);
get.setAccessible(true);
//執(zhí)行g(shù)et方法
Object invokeEntry=get.invoke(mObserversObject,observer);
//定義一個(gè)空的對(duì)象
Object observerWraper=null;
if(invokeEntry!=null && invokeEntry instanceof Map.Entry){
observerWraper=((Map.Entry)invokeEntry).getValue();
}
if(observerWraper==null){
throw new NullPointerException("observerWraper is null");
}
//得到ObserverWrapper的類對(duì)象 編譯擦除問題會(huì)引起多態(tài)沖突所以用getSuperclass
Class<?> superclass = observerWraper.getClass().getSuperclass();
Field mLastVersion = superclass.getDeclaredField("mLastVersion");
mLastVersion.setAccessible(true);
//2.得到mVersion
Field mVersion = liveDataClass.getDeclaredField("mVersion");
mVersion.setAccessible(true);
//3.把mVersion的數(shù)據(jù)填入到mLastVersion中
Object mVersionValue=mVersion.get(this);
mLastVersion.set(observerWraper,mVersionValue);
}catch (Exception e){
e.printStackTrace();
}
}
}
}
目錄:
Jetpack(一)Lifecycle和LiveData
JetPacks之Lifecycles原理
JetPack之 LifeCycle LiveData
Jetpack(三) 之 Room 與 ViewModel
Jetpack 之 ViewModel 原理
Jetpack (四) 之 Navigation
Jetpack Navigation 原理淺析