LiveData 和ViewModel 简介
LiveData 和ViewModel是官方JetPack组件重要组成部分。
ViewModel 当因系统配置发生改变导致 Activity 重建的时候(比如旋转屏幕,更改系统语言),能对 LiveData 进行正确的保存和恢复(当然这要配合 LiveData)。当然如果是系统资源紧张被清除是不能恢复的。
-
LiveData 的作用是在使得数据能具有生命周期感知能力,在 Activity 等变为活跃状态的时候,自动回调观察者中的回调方法,也就是说对数据的变化进行实时监听。这样就不会出现异步请求数据成功后UI不活跃的时候出现空指针异常,也可以很好的避免内存泄露
但是onChange 观察回调官方只是处理成功数据的回调,我们需要封装StateLiveData处理网络错误,服务器自定义的一些返回码等情况。
源码请点击:StateLiveData
//LiveData 具有生命周期感知能力,它会自动对这些进行管理
//UI 组件只需要对相关的数据进行监听,不需要关心是否应该暂停或者恢复监听。
blogViewModel.getAllBlog().observe(this, stateData -> {
switch (stateData.getStatus()) {
case SUCCESS:
disposeSuccessData(stateData.getData());
break;
case ERROR:
//全局统一的错误处理,http 提示和UI 空页面,错误页面提示等. 静默请求是不需要的
BaseDispose.errorDispose(mBaseLoadService, getActivity(), stateData.getMsg(), stateData.getCode());
break;
}
});
这样子我们就知道在网络请求的时候的Loading,Error,Success 等状态了,封装后使用也很简单
public StateLiveData getStateLiveData() {
//1.异步加载网络请求数据
newsApiService.getNews()
.compose(SwitchSchedulers.applyScheduler2())//rxjava 切换线程
.subscribe(new HttpObserver() {
@Override
public void onSuccess(NewsResult newsResult) {
stateLiveData.postSuccess(newsResult);
}
@Override
public void onFailure(int code, String message) {
super.onFailure(code, message);
//把错误信息告知给UI操作层面,好全局处理
stateLiveData.postFailure(message + code);
}
});
return stateLiveData;
}
完整Demo: https://github.com/AnyLifeZLB/MVP-Dagger2-Rxjava2
StateLiveData 和Retrofit 结合使用的拓展(no rxjava)
怎么兼容以前的用法,可以自由的切换呢?尝试了一下好像是可以同时设置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();
请求的时候在NewsApiService.java 中定义不同返回就可以了
@GET("today")
Observable> getNews();
/**
* 直接返回LiveData
*/
@GET("today")
LiveData> getNewsLiveData();
Demo代码GitHub链接点这里
请选择组件化开发模式的module_news 调试