baseResp.dataState = DataState.STATE_ERROR
baseResp.error = e
} finally {
stateLiveData.postValue(baseResp)
}
}
}
executeResp()
为数据请求的公共方法,该方法传入了两个参数,第一个是将数据请求函数当作参数,第二个就是上面新建的StateLiveData
。
方法一开始就新建了一个BaseResp()对象,将DataState.STATE_LOADING
状态设置给BaseResp的dataState,接着开始对数据请求进行异常处理(具体可查看上一篇),如果code=0表示接口请求成功,否则表示接口请求成功,服务器返回错误。在code=0时,对返回数据进行判空处理,因为数据有多种类型,这里需要自己设置类型进行判断,为空就将状态设置为DataState.STATE_EMPTY
,否则为
DataState.STATE_SUCCESS
。如果抛出异常,则将状态设置为DataState.STATE_ERROR
,在请求结束后,利用stateLiveData
将带有状态的baseResp分发给UI。
到这里,请求状态都设置完成,接下来只需要根据不同状态,开始进行界面切换处理。
三、结合LoadSir界面切换
LoadSir是一个加载反馈页管理框架,状态页自动切换,具体使用在这里就不描述了,需要的可移步github查看。
LiveData接收数据变化时,UI会先注册一个接收事件的观察者,接收到请求的数据后就进行UI更新,第二节里将不同状态也添加到了数据中,要想对状态也进行监听的话,就需要对Observer进行状态处理。
/**
- LiveData Observer的一个类,
- 主要结合LoadSir,根据BaseResp里面的State分别加载不同的UI,如Loading,Error
- 同时重写onChanged回调,分为onDataChange,onDataEmpty,onError,
- 开发者可以在UI层,每个接口请求时,直接创建IStateObserver,重写相应callback。
*/
abstract class IStateObserver(view: View?) : Observer<BaseResp>, Callback.OnReloadListener {
private var mLoadService: LoadService? = null
init {
if (view != null) {
mLoadService = LoadSir.getDefault().register(view, this,
Convertor<BaseResp> { t ->
var resultCode: Class = SuccessCallback::class.java
when (t?.dataState) {
//数据刚开始请求,loading
DataState.STATE_CREATE, DataState.STATE_LOADING -> resultCode =
LoadingCallback::class.java
//请求成功
DataState.STATE_