一,Retrofit的前世今生
Retrofit(A type-safeHTTP clientfor Android and Java),美国square公司开发的,个人理解就是一个第三方库,运用android和java的网络库,通俗来说就是把我们底层的网络访问给封装好了,并且具有线程和网络安全的优点,支持lambda语法,内部支持okhttp, 并且支持响应式RxJAava。
如何在底层封装的?
答:在没有okhttp之前,把我们那些自己要写的post,get,pull,delete等完美封装成注入的形式,对http的接口在进行一次自我的封装,然后实现其方法,Retrofit实现接口的方法创建一个api,这个api其实包含了一个call,每个call里面其实都实现了同步或者异步的http请求。
我简单的画了个草图:
详细参考官网:http://square.github.io/retrofit/
二,Demo
讲太多理论的东西都是瞎扯淡,直接干点实事吧。以登录为例(请求web登录的模式):
备注使用时我们需要在gradle配置下:
编译之后我们会发现项目中多了几个类库:
well,现在环境准备好,那就开始编码吧,先列举下,在不用Retrofit的情况我通常会这样使用:
利用异步线程解决ui更新的问题,好像这样也可以。
现在用Retrofit来做同样的事情对比下:
首先针对于这个简单的功能,我们先一种MVC的思想捋下他的架构。
View -- Model -- Control
View: 在这里就是一个简单的xml,给其name和pass
Model: 就是把业务封装在Retrofit里面,构建Retrofit的类
Control: 就是通过callback的数据进行不同的数据流向。
着重讲model边上代码边讲解:
这是核心部分,不难看出这里还会用到一个RetrofiApi,LoginListener自己定义的接口。分别来讲下:
首先我们得知道Retrofit创建后就等于是拿到了一个工具箱,这里面各种的设置满足你的需求,可是如何实现自己的业务,那就看自己的api要做些什么了,比如我这里api:
RetrofitApi:
public interfaceRetrofitApi {
@GET("login/")
CallmachResult(@Query("name") String name,@Query("pass") String pass);}
可以看出就是正儿八经的网络访问,用get的请求方式,把username和password的传给服务器。@GET("login/")看到这个标识知道ssh框架的都知道这是一种跳转的方向指向,代表的是login的方法而不是其他。这里的Call泛指了我们自定义的LoginListener,也就是说会把执行结果反馈给我们自己的callback。接着便是我们对执行结果的处理了。
走到这里的时候,聪明的小伙伴已经恍然大悟了,好简单啊,Retrofit其实最强大的部分就是通过他可以随意创建自己的api,想怎么玩就怎么玩,也不用担心网络的安全,异步等问题,反正底层都给我们封装好了。
截止目前便完成了一个很小的demo。
三,Retrofi的扩展功能:
A.Log输出:
// log 输出
Retrofit retrofit1 =newRetrofit.Builder().client(newOkHttpClient.Builder()
.addNetworkInterceptor(newHttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.HEADERS)).build());
B. Header加入:
// 增加头部信息
newRetrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.client(newOkHttpClient.Builder()
.addInterceptor(newInterceptor() {
@Override
publicokhttp3.Responseintercept(Chain chain)throwsIOException {
Request request = chain.request()
.newBuilder()
.addHeader("test","test")
.addHeader("test","test")
.addHeader("test","test")
.addHeader("test","test")
.build();
returnchain.proceed(request);
}
})
.build();
C: 添加代理,https,加入证书等:
都是在okHttpclient里操作然后塞给Retrofit,比如:
Proxy proxy =newProxy(Proxy.Type.HTTP, newInetSocketAddress("",""));
OkHttpClient client =newOkHttpClient.Builder().proxy(proxy).build();
newRetrofit.Builder().client(client);
D: 关于Rxjava在Retrofit里的使用
newRetrofit.Builder().addCallAdapterFactory(RxJavaCallAdapterFactory.create());
可以看出Retrofit提供了不同的适配工厂,在这里你可以塞进去自己的工厂,比如RxJavaCallAdapaterFActory(自己创建的)。关于这一点,感兴趣的小伙伴可以再做深入的探究。
三,总结
Retrofit用起来看似很方便,但是个人觉得实际强大的还是okhttp,他对okhttp的依赖还是很大,只不过是在用户的使用的时候方便,代码简介明了,但是并不是完美的,对于知识个人觉得合适的才是最好的,但是必须得了解,毕竟是靠这个吃饭的。:)
以上是我自己的实践总结,不足之处欢迎指出!
下一篇有时间会研究网络安全和证书的问题。