LiveData 和ViewModel 簡(jiǎn)介
LiveData 和ViewModel是官方JetPack組件重要組成部分。
ViewModel 當(dāng)因系統(tǒng)配置發(fā)生改變導(dǎo)致 Activity 重建的時(shí)候(比如旋轉(zhuǎn)屏幕,更改系統(tǒng)語言),能對(duì) LiveData 進(jìn)行正確的保存和恢復(fù)(當(dāng)然這要配合 LiveData)。當(dāng)然如果是系統(tǒng)資源緊張被清除是不能恢復(fù)的。
-
LiveData 的作用是在使得數(shù)據(jù)能具有生命周期感知能力,在 Activity 等變?yōu)榛钴S狀態(tài)的時(shí)候,自動(dòng)回調(diào)觀察者中的回調(diào)方法,也就是說對(duì)數(shù)據(jù)的變化進(jìn)行實(shí)時(shí)監(jiān)聽。這樣就不會(huì)出現(xiàn)異步請(qǐng)求數(shù)據(jù)成功后UI不活躍的時(shí)候出現(xiàn)空指針異常,也可以很好的避免內(nèi)存泄露
image.png
但是onChange 觀察回調(diào)官方只是處理成功數(shù)據(jù)的回調(diào),我們需要封裝StateLiveData處理網(wǎng)絡(luò)錯(cuò)誤,服務(wù)器自定義的一些返回碼等情況。
源碼請(qǐng)點(diǎn)擊:StateLiveData
//LiveData 具有生命周期感知能力,它會(huì)自動(dòng)對(duì)這些進(jìn)行管理
//UI 組件只需要對(duì)相關(guān)的數(shù)據(jù)進(jìn)行監(jiān)聽,不需要關(guān)心是否應(yīng)該暫?;蛘呋謴?fù)監(jiān)聽。
blogViewModel.getAllBlog().observe(this, stateData -> {
switch (stateData.getStatus()) {
case SUCCESS:
disposeSuccessData(stateData.getData());
break;
case ERROR:
//全局統(tǒng)一的錯(cuò)誤處理,http 提示和UI 空頁面,錯(cuò)誤頁面提示等. 靜默請(qǐng)求是不需要的
BaseDispose.errorDispose(mBaseLoadService, getActivity(), stateData.getMsg(), stateData.getCode());
break;
}
});
這樣子我們就知道在網(wǎng)絡(luò)請(qǐng)求的時(shí)候的Loading,Error,Success 等狀態(tài)了,封裝后使用也很簡(jiǎn)單
public StateLiveData<HotNewsResult> getStateLiveData() {
//1.異步加載網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)
newsApiService.getNews()
.compose(SwitchSchedulers.applyScheduler2())//rxjava 切換線程
.subscribe(new HttpObserver<NewsResult>() {
@Override
public void onSuccess(NewsResult newsResult) {
stateLiveData.postSuccess(newsResult);
}
@Override
public void onFailure(int code, String message) {
super.onFailure(code, message);
//把錯(cuò)誤信息告知給UI操作層面,好全局處理
stateLiveData.postFailure(message + code);
}
});
return stateLiveData;
}
完整Demo: https://github.com/AnyLifeZLB/MVP-Dagger2-Rxjava2
StateLiveData 和Retrofit 結(jié)合使用的拓展(no rxjava)
怎么兼容以前的用法,可以自由的切換呢?嘗試了一下好像是可以同時(shí)設(shè)置RxJava2CallAdapterFactory和LiveDataCallAdapterFactory 的。至于拓展,大神們自己來操刀吧
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl) //Set the Api Base URL
.client(okHttpClient) //The HTTP client used for requests.
.addConverterFactory(GsonConverterFactory.create())
//RxJava2CallAdapterFactory
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
//LiveData Call Factory
.addCallAdapterFactory(new LiveDataCallAdapterFactory()) //CallAdapter
.build();
請(qǐng)求的時(shí)候在NewsApiService.java 中定義不同返回就可以了
@GET("today")
Observable<NewsHttpResponse<HotNewsResult>> getNews();
/**
* 直接返回LiveData
*/
@GET("today")
LiveData<NewsHttpResponse<HotNewsResult>> getNewsLiveData();
請(qǐng)選擇組件化開發(fā)模式的module_news 調(diào)試

