前言:
在几个月前,我曾经也写过这样的一篇文章,后来回头看的时候,发现写的真的是太糟糕了,很多地方没有写出说明,而且封装的思路等也没写出来,因此,决定重新写。
1.为什么要封装?
简单粗暴一句话:减少代码量,方便调用和维护
2.封装的步骤:
①:定义一个实体类,统一存放请求得到的数据(数据需要和后台达成一致)
②:定义一个类,用来存放网络请求的地址
③:定义一个类,用来统一处理网络请求
④:定义一个类,用来处理网络请求前,请求后,包括请求失败,请求成功,没有网络的情况
⑤:定义一个类,用来剥离请求后的需要的数据部分(也可以不需要)
现在就开始具体的代码实现
一:统一的实体类
其中,data就是我们真正需要的数据部分
二:网络请求地址类
可以看到,我们有一个统一的接口,还有一个登录的接口地址
三:网络请求类
我们通过okHttpClient.builder构建出一个httpClientBuilder,并且设置了超时时间,使用的是单利模式,并且返回通过retrofit.create(service)返回一个泛型类,为rxjava做准备
四:网络请求的操作
我们在请求网络时,在请求前,请求后都有对应的操作,在发起请求的前,首先我们需要检查是否有网络,没有就告诉用户,并且不发起请求,否则,就显示一个对话框告诉用户正在进行加载数据,请求完成后,对话框消失,如果成功,则把数据回调,否则弹出失败的原因
(由于代码比较长,所以采用分段截图,望大家不要介意)
我们使用一个抽象类,继承了Subscriber<T>,并且定义的成功和失败的回调方法,可以看到,当成功后,我们将数据返回,失败了,则告诉用户
五:统一的数据剥离
当flag==1的时候,说明请求数据了,我们则需要把数据的data部分抽取出来,否则,我们就弹出错误的信息,为什么说这个可以要也可以不要,因为有些时候,我们可能并不需要data部分,也有可能flag有其他的值,需要做不同的处理,所以这个还得看需求,如果我们不需要的时候,我们可以指定请求的线程在io线程,然后回调给主线程就可以了
到这里,基本的封装就完成了,现在我们来看看怎么用
首先我们需要定义一个接口:
这里的post代表的是post请求,@FormUrlEncoded是表单形式,post里面的是请求的地址,我这里只是示例,在开发中需要换成你自己的请求地址,然后就是一系列的请求参数,具体入参就要自己去换了
我们需要定义一个LoginApi,去发起网络请求,
通过刚刚的HttpApi中的getService返回对应的接口,并且调用doLogin方法,就可以了,这里注意一下,我现在使用的是不需要成功后就立刻转成实体类,仅仅只是将请求时放在io线程去处理,通过.compose这个操作符去实现,并且回调给RxSubscibe,我们来看看成功后立刻转成实体类是怎样,
可以看出来差别只是少了BaseEntity,这样的话,就没有办法拿到BaseEntity.getFlag()的方法,具体情况看需求
然后,我们在MainActivity中调用
首先我们需要new出Api,然后调用api的doLogin方法
这种是不需要立刻转成实体类,否则是这样的
好了,整个RxJava+Retrofit的二次封装就完成了