最近由于项目需求,开始接触学习Rxjava、Rxandroid、Retrofit,小编这里不再对于Rxjava、Retrofit等知识进行详解,而是针对于以下几点来对实践过程中的经验进行总结。
Demo中基于以下几点对于RxJava与Retrofit结合使用实践过程进行封装,使开发者腾出更多精力专注于上层业务开发。
1.通过泛型对于相同格式的Http返回数据进行封装
在项目开发过程中,对于Http返回数据格式一般都有固定的格式,例如:
{
"ResultCode":0, //接口请求结果状态
"ResultMessage":"success", //接口请求结果描述
"Resultdata":{} //具体接口返回数据
}
ResultCode和ResultMessage的信息相对来说比较简单稳定,而Resultdata数据格式千变万化,有可能是一个Doctor对象,也有可能是一个Patient对象,也有可能是一个列表数据...如果这样定义返回类型,那么由于Resultdata的不确定性,可能有数不清的Entity对象,对于任何一个开发者来说,这无疑是一场灾难。
解决方法:通过泛型对于相同格式的Http返回数据进行封装
![](https://img.haomeiwen.com/i5014400/093639ddf5ac72e2.png)
如果返回的Resultdata为Doctor对象,你只需要在修改相应请求接口返回类型为Doctor即可
![](https://img.haomeiwen.com/i5014400/6dcc1fa062fe81ca.png)
这样一来HttpRequestResult就相当于一个包装类,将结果包装了起来,但是在使用的时候要给出一个明确的类型。
![](https://img.haomeiwen.com/i5014400/c9415b5694180989.png)
2.通过Subscriber的OnError对于相同格式的Http返回数据统一进行预处理
项目中当接收到了一个Http请求结果之后,由于返回的结构统一为
{
"ResultCode":0, //接口请求结果状态
"ResultMessage":"success", //接口请求结果描述
"Resultdata":{} //具体接口返回数据
}
ResultCode不等于0时,将相应的请求失败提示信息ResultMessage做统一的处理(404 Not Found、505 Error等。
相信这时大家第一时间想到的是使用Observable的map方法,在map中对Response数据做统一的预处理(首先对ResultCode做判断,如果不等于0,则通过抛出异常的方式,进入Subscriber的OnError方法,如果等于0,则返回从Response中剥离出的ResultData)
![](https://img.haomeiwen.com/i5014400/b69bbb30ac6030a4.png)
3.通过Subscriber的unsubscribe取消一个Http请求
我们通过学习Rxjava知道,可以通过调用接口返回的Call对象cancel方法可以用来取消Http请求。那么用了Retorfit之后,如何来取消一个请求呢?因为返回值是一个Observable。我们能做的似乎只有解除对Observable对象的订阅,其他的什么也做不了。
其实在Retrofit中我们可以通过创建的Subscriber,通过调用其unsubscribe方法即可取消当前Http请求
![](https://img.haomeiwen.com/i5014400/7532927afb4b5f0b.png)
4.通过一个自定义的ProgressDialog与Subscriber进行结合
在项目开发过程中,我们往往会要求,在有网络请求的地方,有Dialog等待提示,让用户有更好的体验。通过一个自定义的ProgressDialog与Subscriber进行结合可以实现这个需求,其实重点是调用了Subscriber的onStart方法,订阅开始时调用显示showProgressDialog,在订阅完成即onCompleted时调用dismissProgressDialog(取消ProgressDialog的时候,取消对observable的订阅,同时也取消了http请求)
代码实现上主要通过自定义的ProgressSubscriber<T>继承Subscriber<T>来实现
![](https://img.haomeiwen.com/i5014400/2669cae1d8cf055b.png)
通过一个自定义接口将Subscriber的onNext事件抛给上层
![](https://img.haomeiwen.com/i5014400/ac2f1f2cbb6794c8.png)
这样针对于开发者,上层只需关注请求成功后,想要处理的业务操作即可。
![](https://img.haomeiwen.com/i5014400/c98e46c3e2887de3.png)
5.添加自定义日志拦截器HttpLoggingInterceptor
项目接口调试开发过程中,开发者需要跟踪请求日志和返回数据,用于调试开发接口。通过自定义的HttpLoggingInterceptor可以实现这一需求。
![](https://img.haomeiwen.com/i5014400/9238704e40b2d157.png)
可以打印的内容有很多,例如:the request url、the request method、the response time、the response state、the response data等
只需将自定义的HttpLoggingInterceptor拦截器通过addNetworkInterceptor方法OkHttpClient联系起来即可
![](https://img.haomeiwen.com/i5014400/2e1db0de783e9187.png)
总结:
1.通过泛型对于相同格式的Http返回数据进行封装
2.通过Subscriber的OnError对于相同格式的Http返回数据统一进行预处理
3.通过Subscriber的unsubscribe取消一个Http请求
4.通过一个自定义的ProgressDialog与Subscriber进行结合(请求开始展示,请求结束消失)
5.添加自定义日志拦截器HttpLoggingInterceptor,打印的内容有请求的url、请求方法、响应时间、响应状态、响应内容等
网友评论