Retrofit使用总结与积累
在安卓项目中使用Retrofit已经接近两年了,但是一直都是按照网上或者公司前辈的使用方式模仿,仅在使用的层面打转。一直也没有对用法进行总结和深入理解它的源码。讲解Retrofit的源码暂时我应该还说不太清晰,这里就先总结一下Retrofit的用法,同时也谈一下我对Retrofit本身的理解。当然也是翻阅了很多资料之后总结截取出来的。
对Retrofit的理解
虽然之前一直在使用Retrofit,但是在很长一段时间里我是不清楚它到底是什么东西的,最近我才翻阅了一些资料总结了一下,起码算是明白了它到底是什么。
稍微熟悉Retrofit的大兄弟都知道Retrofit是一个基于 OkHttp 的 RESTful API 请求工具。意思就是Retrofit网络访问框架用来做请求的实际上还是Okhttp,Retrofit只是在Okhttp上做了一层封装。
Retrofit和Okhttp的联系
使用Retrofit在App中进行网络请求的过程中,首先App发出请求,然后Retrofit 通过注解配置请求参数、Header、url等,然后通过OkHttp发送网络请求给服务器。
以上过程服务器返回响应数据时,OkHttp将数据传递给Retrofit,再把数据直接传递给APP,然后可以进行刷新页面数据等操作。
Retrofit和Okhttp的区别
OkHttp和Retrofit都是网络开源框架,他们的区别是什么呢?
- Retrofit主要负责应用层面的封装,就是说主要面向开发者,方便使用,比如请求参数,响应数据的处理,错误处理等等。OkHttp主要负责socket部分的优化,比如多路复用,buffer缓存,数据压缩等等。
- Retrofit封装了具体的请求,线程切换以及数据转换。OkHttp 是基于Http协议封装的一套请求客户端,虽然它也可以开线程,但根本上它更偏向真正的请求,跟HttpClient, HttpUrlConnection的职责是一样的。
为什么用Retrofit而不直接使用okhttp?
使用retrofit 主要是为了生成请求方便,okhttp 生成请求会有大量重复代码,用retrofit使用注解可以方便的定义请求,然后自动生成这些重复的请求代码。
Retrofit理解总结
retrofit 是一个基于okhttp的网络访问框架,网络请求本质上是okhttp完成的,retrofit 仅负责网络请求接口的封装。retrofit在请求接口中通过注解配置请求参数、Header、url等,Retrofit类似于一个网络请求适配器,将一个基本的Java接口通过动态代理的方式翻译成一个HTTP请求,并通过okhttp去发送请求。
Retrofit基本使用
在app下的build.gradle中加入以下库就能使用Retrofit.
1、添加依赖库
compile 'com.squareup.retrofit2:retrofit:2.1.0'
2、创建用于描述网络请求的接口。
@FormUrlEncoded
@POST("user/edit.do")
Observable<BaseResult> editAvatar(@Field("userImg") String userImg);
这是我项目中的一个请求接口,这里接口返回是一个Observable对象,是因为我是配合rxjava使用的,如果不使用rxjava配合应该是返回一个Call对象。这部分下面再说。
3、创建 Retrofit 实例。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("")
.addConverterFactory(FastJsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)
.build();
4、创建网络请求接口实例。
ClientApi是我创建的网络请求接口
ClientApi clientApi = retrofit.create(ClientApi.class);
5、发送请求(基于rxjava的)
HttpManager.getInstance().getApi().editAvatar("")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<BaseResult>() {
@Override
public void call(BaseResult baseResult) {
}
});
上述代码中HttpManager.getInstance().getApi()得到的就是网络请求接口的实例即上述clientApi 。
Retrofit的Converter和CallAdapter
Converter
使用Retrofit的时候会创建请求接口,内部的方法返回值是Call<T>的格式。这里的T默认是ResponseBody,不过我们可以使用Converter这个功能把返回的数据解析成我们想要的样子。即Converter是对于Call中T的转换
一般情况下我们都使用GsonConverterFactory,当请求到json后,Retrofit就会调用GsonConverter将json转成我们需要的实体。
使用GsonConverter需要添加库
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
然后在创建Retrofit对象的时候调用 :
.addConverterFactory(GsonConverterFactory.create())
当然Converter可以自定义。
CallAdapter
Converter是对于Call中T的转换,而CallAdapter则可以对Call转换,这样的话Call中的Call也是可以被替换的,而返回值的类型就决定你后续的处理程序逻辑,同样Retrofit提供了多个CallAdapter。最受吹捧的就是rxjava.使用方式如下:
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
创建retrofit实例的时候加了这么一句就可以将描述网络请求的接口中的方法的返回值变为Observable。这样也就可以接着使用rxjava的链式结构访问网络了。
以上是我对Retrofit的一点总结,其实也是参照各路大神的博客,把这些基础的知识点放到一起方便理解而已。本篇博客在Retrofit的使用上说的不是很详细,像注解的使用什么的都没有涉及,其实我写本篇的目的其实不是在使用上,主要就是前半部分的理解部分。希望能帮大家理解Retrofit,当然也为了自己查阅方便。
网友评论