Rxjava+Retrofit封装实践

最近由于项目需求,开始接触学习Rxjava、Rxandroid、Retrofit,小编这里不再对于Rxjava、Retrofit等知识进行详解,而是针对于以下几点来对实践过程中的经验进行总结。

RxjavaRetrofitDemo

Demo中基于以下几点对于RxJava与Retrofit结合使用实践过程进行封装,使开发者腾出更多精力专注于上层业务开发。

1.通过泛型对于相同格式的Http返回数据进行封装

在项目开发过程中,对于Http返回数据格式一般都有固定的格式,例如:

{

"ResultCode":0,   //接口请求结果状态

"ResultMessage":"success",  //接口请求结果描述

"Resultdata":{}   //具体接口返回数据

}

ResultCode和ResultMessage的信息相对来说比较简单稳定,而Resultdata数据格式千变万化,有可能是一个Doctor对象,也有可能是一个Patient对象,也有可能是一个列表数据...如果这样定义返回类型,那么由于Resultdata的不确定性,可能有数不清的Entity对象,对于任何一个开发者来说,这无疑是一场灾难。

解决方法:通过泛型对于相同格式的Http返回数据进行封装

Rxjava+Retrofit封装实践_第1张图片
通过泛型对于相同格式的Http返回数据进行封装

如果返回的Resultdata为Doctor对象,你只需要在修改相应请求接口返回类型为Doctor即可

Rxjava+Retrofit封装实践_第2张图片
修改相应请求接口返回类型为Doctor

这样一来HttpRequestResult就相当于一个包装类,将结果包装了起来,但是在使用的时候要给出一个明确的类型。

Rxjava+Retrofit封装实践_第3张图片
使用的时候要给出一个明确的类型

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)

Rxjava+Retrofit封装实践_第4张图片
Observable的map方法

3.通过Subscriber的unsubscribe取消一个Http请求

我们通过学习Rxjava知道,可以通过调用接口返回的Call对象cancel方法可以用来取消Http请求。那么用了Retorfit之后,如何来取消一个请求呢?因为返回值是一个Observable。我们能做的似乎只有解除对Observable对象的订阅,其他的什么也做不了。

其实在Retrofit中我们可以通过创建的Subscriber,通过调用其unsubscribe方法即可取消当前Http请求

Rxjava+Retrofit封装实践_第5张图片
Subscriber.unsubscribe()

4.通过一个自定义的ProgressDialog与Subscriber进行结合

在项目开发过程中,我们往往会要求,在有网络请求的地方,有Dialog等待提示,让用户有更好的体验。通过一个自定义的ProgressDialog与Subscriber进行结合可以实现这个需求,其实重点是调用了Subscriber的onStart方法,订阅开始时调用显示showProgressDialog,在订阅完成即onCompleted时调用dismissProgressDialog(取消ProgressDialog的时候,取消对observable的订阅,同时也取消了http请求)

代码实现上主要通过自定义的ProgressSubscriber继承Subscriber来实现

Rxjava+Retrofit封装实践_第6张图片
自定义的ProgressSubscriber

通过一个自定义接口将Subscriber的onNext事件抛给上层

Rxjava+Retrofit封装实践_第7张图片
自定义接口将Subscriber的onNext事件抛给上层

这样针对于开发者,上层只需关注请求成功后,想要处理的业务操作即可。


Rxjava+Retrofit封装实践_第8张图片
业务处理操作

5.添加自定义日志拦截器HttpLoggingInterceptor

项目接口调试开发过程中,开发者需要跟踪请求日志和返回数据,用于调试开发接口。通过自定义的HttpLoggingInterceptor可以实现这一需求。

Rxjava+Retrofit封装实践_第9张图片
自定义的HttpLoggingInterceptor

可以打印的内容有很多,例如:the request url、the request method、the response time、the response state、the response data等

只需将自定义的HttpLoggingInterceptor拦截器通过addNetworkInterceptor方法OkHttpClient联系起来即可

Rxjava+Retrofit封装实践_第10张图片
使用自定义的HttpLoggingInterceptor拦截器

总结:

1.通过泛型对于相同格式的Http返回数据进行封装

2.通过Subscriber的OnError对于相同格式的Http返回数据统一进行预处理

3.通过Subscriber的unsubscribe取消一个Http请求

4.通过一个自定义的ProgressDialog与Subscriber进行结合(请求开始展示,请求结束消失)

5.添加自定义日志拦截器HttpLoggingInterceptor,打印的内容有请求的url、请求方法、响应时间、响应状态、响应内容等

你可能感兴趣的:(Rxjava+Retrofit封装实践)