基于RxJava和Retrofit的二次封装

前言:

在几个月前,我曾经也写过这样的一篇文章,后来回头看的时候,发现写的真的是太糟糕了,很多地方没有写出说明,而且封装的思路等也没写出来,因此,决定重新写。


1.为什么要封装?
简单粗暴一句话:减少代码量,方便调用和维护
2.封装的步骤:
①:定义一个实体类,统一存放请求得到的数据(数据需要和后台达成一致)
②:定义一个类,用来存放网络请求的地址
③:定义一个类,用来统一处理网络请求
④:定义一个类,用来处理网络请求前,请求后,包括请求失败,请求成功,没有网络的情况
⑤:定义一个类,用来剥离请求后的需要的数据部分(也可以不需要)
现在就开始具体的代码实现


一:统一的实体类

基于RxJava和Retrofit的二次封装_第1张图片
实体类.png

其中,data就是我们真正需要的数据部分


二:网络请求地址类

网络请求地址类.png

可以看到,我们有一个统一的接口,还有一个登录的接口地址


三:网络请求类

基于RxJava和Retrofit的二次封装_第2张图片
基于RxJava和Retrofit的二次封装_第3张图片

我们通过okHttpClient.builder构建出一个httpClientBuilder,并且设置了超时时间,使用的是单利模式,并且返回通过retrofit.create(service)返回一个泛型类,为rxjava做准备


四:网络请求的操作

我们在请求网络时,在请求前,请求后都有对应的操作,在发起请求的前,首先我们需要检查是否有网络,没有就告诉用户,并且不发起请求,否则,就显示一个对话框告诉用户正在进行加载数据,请求完成后,对话框消失,如果成功,则把数据回调,否则弹出失败的原因

基于RxJava和Retrofit的二次封装_第4张图片
基于RxJava和Retrofit的二次封装_第5张图片
基于RxJava和Retrofit的二次封装_第6张图片
基于RxJava和Retrofit的二次封装_第7张图片
基于RxJava和Retrofit的二次封装_第8张图片

(由于代码比较长,所以采用分段截图,望大家不要介意)
我们使用一个抽象类,继承了Subscriber,并且定义的成功和失败的回调方法,可以看到,当成功后,我们将数据返回,失败了,则告诉用户


五:统一的数据剥离

基于RxJava和Retrofit的二次封装_第9张图片
基于RxJava和Retrofit的二次封装_第10张图片

当flag==1的时候,说明请求数据了,我们则需要把数据的data部分抽取出来,否则,我们就弹出错误的信息,为什么说这个可以要也可以不要,因为有些时候,我们可能并不需要data部分,也有可能flag有其他的值,需要做不同的处理,所以这个还得看需求,如果我们不需要的时候,我们可以指定请求的线程在io线程,然后回调给主线程就可以了


基于RxJava和Retrofit的二次封装_第11张图片

到这里,基本的封装就完成了,现在我们来看看怎么用


首先我们需要定义一个接口:

基于RxJava和Retrofit的二次封装_第12张图片

这里的post代表的是post请求,@FormUrlEncoded是表单形式,post里面的是请求的地址,我这里只是示例,在开发中需要换成你自己的请求地址,然后就是一系列的请求参数,具体入参就要自己去换了

我们需要定义一个LoginApi,去发起网络请求,

基于RxJava和Retrofit的二次封装_第13张图片

通过刚刚的HttpApi中的getService返回对应的接口,并且调用doLogin方法,就可以了,这里注意一下,我现在使用的是不需要成功后就立刻转成实体类,仅仅只是将请求时放在io线程去处理,通过.compose这个操作符去实现,并且回调给RxSubscibe,我们来看看成功后立刻转成实体类是怎样,

基于RxJava和Retrofit的二次封装_第14张图片

可以看出来差别只是少了BaseEntity,这样的话,就没有办法拿到BaseEntity.getFlag()的方法,具体情况看需求

然后,我们在MainActivity中调用
首先我们需要new出Api,然后调用api的doLogin方法

基于RxJava和Retrofit的二次封装_第15张图片

这种是不需要立刻转成实体类,否则是这样的

基于RxJava和Retrofit的二次封装_第16张图片

好了,整个RxJava+Retrofit的二次封装就完成了

你可能感兴趣的:(基于RxJava和Retrofit的二次封装)