一. 使用
Lifecycle如果用Activity/Fragment的話扒吁,可以不必理會犁钟,直接用support包版本26.1.0以上的AppCompactActivity/FragmentActivity(繼承自SupportActivity)或者Fragment即可
一般由Activity在onCreate()的時候通過ViewProviders.of(this).get(xxxViewModel.class)創(chuàng)建稳摄,例如
public class MyActivity extends FragmentActivity {
MyActivity mViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
mViewModel = ViewModelProviders.of(this).get(MyActivityViewModel.class);
}
}
Activity直接調(diào)用ViewModel去做一些業(yè)務(wù)邏輯稚字,并通過監(jiān)聽ViewModel中的LiveData變化來更新界面
public class MyActivity extends FragmentActivity {
MyActivityViewModel mViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
mViewModel = ViewModelProviders.of(this).get(MyActivityViewModel.class);
mViewModel.getProductShowLiveData().observe(this, product -> {
if (product.isConnected()) {
// 更新UI
mTextView.setText(getString(product.getNameId());
}
});
// 一些業(yè)務(wù)邏輯
mViewModel.doSomeBusiness();
}
}
public class MyActivityViewModel extends BaseRxViewModel<MyActivityRepository> {
private MutableLiveData<ProductTypeShowData> mProductShowLiveData = new MutableLiveData<>();
public MyActivityViewModel(@NonNull Application application) {
super(application);
}
private void doSomeBusiness() {
// 一些業(yè)務(wù)邏輯
...
// 通知UI更新,并將UI需要的數(shù)據(jù)源setValue通知出去
mProductShowLiveData.setValue(XXXX);
}
}
二. 原理
ViewModel
ViewModel的功能在于能自動處理轉(zhuǎn)屏厦酬,切換輸入法等配置變更引起的Activity銷毀胆描,生命周期重走問題,使得重新生成的Activity拿到的依然是之前的ViewModel仗阅,也即該ViewModel的生命周期是從Activity start到finish昌讲,中間不管因?yàn)榕渲米兏麬ctivity銷毀重啟多少次,ViewModel都是不會重啟的(所以不能在ViewModel里持有Activity的Context)
具體源碼分析推薦可以閱讀這篇文章减噪,基本原理是在Activity上add一個setRetainInstance(true)的HolderFragment短绸,由其保存對應(yīng)Activity的ViewModelStore车吹,在Activity重走生命周期后,在onCreate()中再次通過ViewModelProviders.of(this)找到對應(yīng)的HolderFragment的ViewModelStore醋闭,并通過get(xxxViewModel.class)以class為key窄驹,找到存在ViewModelStore中的ViewModel。
(故在Fragment之間可以通過ViewModelProviders.of(getActivity()).get(xxxViewModel.class)來獲取到相同的ViewModel证逻,從而實(shí)現(xiàn)Fragment之間的ViewModel共享)
LiveData
LiveData的功能在于乐埠,在于setValue時(非UI線程使用postValue),會根據(jù)當(dāng)前界面的生命周期(通過在界面上add一個無界面的ReportFragment囚企,接收其生命周期回調(diào)來實(shí)現(xiàn)丈咐,很經(jīng)典的做法,Glide比起其他的圖片加載庫有感知生命周期的功能也是這么做的)龙宏,選擇要不要回調(diào)到UI界面更新(在對應(yīng)的Activity調(diào)用onStart()之前棵逊,onStop()之后,都是不會更新界面的)烦衣,那么如果遇到這些情況歹河,LiveData會選擇在每一次對應(yīng)界面的生命周期變化時,以及調(diào)用LiveData.observe()建立監(jiān)聽關(guān)系時再去嘗試回調(diào)UI更新
關(guān)于這塊的源碼花吟,代碼量其實(shí)也不多秸歧,LiveData相關(guān)的還是比較簡單的,LifecycleRegistry分發(fā)生命周期稍微有一點(diǎn)點(diǎn)繞衅澈,但也還好键菱,在使用過的基礎(chǔ)上一天基本就能通讀代碼
源碼解析鏈接里這位博主寫的很好:
LiveData:
https://jekton.github.io/2018/07/14/android-arch-LiveData/
Lifecycle
https://jekton.github.io/2018/07/06/android-arch-lifecycle/
三. 總結(jié)
LiveData,ViewModel以及Lifecycle相關(guān)的api都已經(jīng)被收錄進(jìn)了google推出的幫助開發(fā)者更快更專注地開發(fā)app的jetpack火箭背包里今布,現(xiàn)在最新的代碼都在androidx庫上更新
https://developer.android.com/topic/libraries/architecture/adding-components#lifecycle