上一篇,我们把mvp+dagger加进去了,这一篇,我们把网络请求加上
我这里的网络请求是用的装饰者模式去写的,什么是装饰者模式呢?在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。我的理解就是一个接口,两个实现类,一个实现类负责调用接口的方法,另一个类负责功能的具体实现。本文中所提到的代码都是伪代码,最后会给出完整的,最初版本的项目框架。不包含任何业务逻辑
容我一个一个来说,首先,我们一般请求网络的时候,会有统一的返回数据格式,一个是需要判断返回code码的,就比方说登录功能,那登录成功,还是失败,我们只用判断code码即可,这种类型,我们统一是HttpNoResult。还有一个是返回数据的,就比方说查一个列表数据。这里我们统一的是HttpResult。我先给出这两个类的代码:
1 | package com.haichenyi.myproject.model.http; |
1 | package com.haichenyi.myproject.model.http; |
这里我就需要说一点,有数据返回的时候,每个数据类型都是不一样的,所以,这里我用的泛型传递,不同的数据类型,传不同的bean对象
言归正传,我们来说说网络请求的一个接口,两个实现类。
一个接口—HttpHelper
1 | package com.haichenyi.myproject.model.http; |
Flowable是RxJava2.0新增的,所以说RxJava完美兼容Retrofit,泛型就是我们需要解析的数据
loginCode方法是说返回数据,我们只用判断是否是成功还是失败,
login方法是说返回数据是一个Login对象,至于对象是什么内容,那就是和你们后台确认了
diyKeys方法就是说,返回数据是一个list对象,每个list的item是DiyBean对象
1 | package com.haichenyi.myproject.model; |
DataHelper是HttpHelper的实现类,他的唯一作用就是调用接口的方法即可,具体的功能实现是后面一个类,这里需要说明的是这个类的构造方法要public表示,因为他要dagger生成,用private或者protected表示无法生成。
1 | package com.haichenyi.myproject.model.http; |
RetrofitHelper类作为HttpHelper接口的实现类,他是具体功能的实现类,为什么说他是具体功能的实现类呢?因为,他是调用HttpApi接口的方法。HttpApi接口是干什么用的呢?
1 | package com.haichenyi.myproject.model.http.api; |
这个就是Retrofit的网络请求的方式,看不懂?这个就是Retrofit的东西了
方法注解,包含@GET、@POST、@PUT、@DELETE、@PATH、@HEAD、@OPTIONS、@HTTP。
标记注解,包含@FormUrlEncoded、@Multipart、@Streaming。
参数注解,包含@Query、@QueryMap、@Body、@Field,@FieldMap、@Part,@PartMap。
其他注解,包含@Path、@Header、@Headers、@Url。
这里我们还差一个接口
1 | package com.haichenyi.myproject.model.http; |
如上,这里需要注意的是不能以”\”结尾,然后就是,跟你们后台商量,格式不要错了,尽量就只有接口名字不同,接口名字前面部分都是一样的。
到此,这里基本上就说完了,那么有同鞋就会问了,接口定义方法的时候,我们知道该如何写返回数据类型呢?这个我就不知道了,你得问你们后台,根据后台返回的数据类型去写对应的bean类。推荐一个功能PostMan。
到目前为止,我们都还没有初始化网络请求的参数,这些网络请求的参数在哪里初始化呢?这些参数,我们就只用初始化一次,我们就想到了dagger的全局单例模式,没错,就是这个,我们上一篇写了很多没有用的东西,里面有一个HttpModule
1 | package com.haichenyi.myproject.di.module; |
如上代码,注释写的都有,考过去用就行了
在AppModule里面添加如下代码
1 | package com.haichenyi.myproject.di.module; |
这里都是dagger了生成全局单例对象需要的东西
在AppComponent里面添加如下代码
1 | package com.haichenyi.myproject.di.component; |
在BaseMvpPresenter里面添加如下代码
1 | package com.haichenyi.myproject.base; |
至此,就全部写完了,关于网络请求的内容。调用方式如下:
1 | package com.haichenyi.myproject.presenter; |
记得在清单文件里面,加上网络权限
1 | <uses-permission android:name="android.permission.INTERNET"/> |
网络请求,这样调用之后在哪处理呢?我给出我的几个处理的工具类。首先,按如下图设置1.8支持lambda表达式
然后添加如下几个类
HttpCode
1 | package com.haichenyi.myproject.model.http; |
ApiException
1 | package com.haichenyi.myproject.model.http; |
MyRxUtils
1 | package com.haichenyi.myproject.model.http; |
MySubscriber
1 | package com.haichenyi.myproject.model.http; |
这几个类不想多做解释,结合注释,仔细看几遍,就知道是干嘛用的了
加上这几个之后调用方式就变成了以下的方式:
1 | package com.haichenyi.myproject.presenter; |
完了,完了,终于写完了。