在說源碼時簡單說下liveData使用
//在app的build添加依賴
//使用liveData
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
1創建一個類實現ViewModel,定義一個方法獲取liveData
/**
* liveData是個抽象類 ,可以理解爲一個能感知生命週期的倉庫
* mutableLIveData 是他的實現類
*/
public class MyViewModel extends ViewModel {
//注意使用static修飾 源碼直接通過類獲取
private static MutableLiveData<List<Bean>> mutableLiveData;
//獲取倉庫
public MutableLiveData<List<Bean>> getLiveData() {
if (mutableLiveData == null) {
mutableLiveData = new MutableLiveData<>();
}
return mutableLiveData;
}
}
2定義一個bean類
public class Bean {
String name;
public Bean(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3在activity中使用
訂閱消息代碼
//調用系統API獲取 viewModel
MyViewModel myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
liveData = myViewModel.getLiveData();
//訂閱消息
liveData.observe(this, new Observer<List<Bean>>() {
@Override
public void onChanged(List<Bean> beans) {
//數據接收
Toast.makeText(LiveDataActivity.this, "" + beans.get(0).getName(), Toast.LENGTH_SHORT).show();
}
});
發送消息代碼
list.add(new Bean("張三"));
list.add(new Bean("李四"));
liveData.setValue(list);
使用很簡單,那我們分析下liveData是源碼時如何實現的呢?
liveData這麼好,那麼我們看看他的源碼的核心邏輯
我們從獲取ViewModel代碼入口 ViewModelProviders.of(this).get(MyViewModel.class);
點擊of()方法,代碼很簡單,獲取activity的application,創建ViewModelProviders對象
點擊get()方法,把ViewModel的實現類和類全類名,傳給內部get方法
點擊內部的get方法,代碼很簡單,先從一個ViewModelStore獲取ViewModel,如果有就直接返回,沒有就創建,再保存到ViewmodelStore,再返回。
我們看看工廠的create()方法是如何創建ViewModel的,看到下圖源碼就一目瞭然,使用反射創建的
我們看看ViewModelStore代碼,就是個HashMap保存的ViewModel封裝類,源碼看多,有很多類似的使用map複用的類似代碼。
現在我們看看MutablLiveData的setValue()方法,點擊進去,沒有什麼代碼,那應該調用父類的setValue方法,
點擊到父類的setValue方法,調用了dispatchValue方法
我們看看dispatchValue做了些什麼,又調用了considerNotify()方法,在這個方法最後行代碼,他實現了接口Observer的onChanged()方法
最終還是通過接口回調方式,把數據給到訂閱者。
這是有人問,那liveData是如何感知感知什麼週期的呢?我們點擊liveData的obser方法,會發現是使用Lifecycle實現生命週期的監聽。
如果對Lifecycle不瞭解的可以看我這篇文章https://blog.csdn.net/qq_36237165/article/details/102544785
liveData源碼介紹到這,下面是我們基於liveData封裝的一個庫,可以實現一行代碼發送消息,一行代碼訂閱消息,還能感知生命週期,從數據根源上防止內存泄漏。
https://blog.csdn.net/qq_36237165/article/details/104878044
喜歡的點星Thanks♪(・ω・)ノ