让Retrofit 2.0为你效命by Jake Wharton

来源:互联网 发布:java 按周统计数据 编辑:程序博客网 时间:2024/05/05 13:14

让Retrofit 2.0为你效命by Jake Wharton

原标题为:Making Retrofit Work For You by Jake Wharton。(2016/10/28)
我在学习Retrofit2.0时,偶然在youtub上看到了这个视屏,一个小时的视屏,四个小时才看完。总觉得自己的记忆会和记得笔记一样很快会消失,不理想。嘛,开始安卓生涯中的第一篇博客吧。

YouTub上的视屏地址
视屏中的代码片段

  • Retrofit的设计思想
    这里写图片描述
    很多服务器端的网络请求都是与接口进行交流来获取信息,Retrofit通过一些metadata 来消除对接口的实现,并把返回的结果放到Call 中从而让你不需要为是否需要同步的问题而改变接口。
    简单来说就是本来几个人干的活全让接口干,使用Retrofit的接口看起来像这样:*
    这里写图片描述

  • Retrofit 不是网络访问客户端
    接口是Retrofit的重要组成部分,剩下的就是将这些接口转化为可以执行的请求。
public interface GitHubService {  @GET("users/{user}/repos")  Call<List<Repo>> listRepos(@Path("user") String user);}Retrofit retrofit = new Retrofit.Builder()    .baseUrl("https://api.github.com/")    .build();GitHubService service = retrofit.create(GitHubService.class);Call<List<Repo>> repos = service.listRepos("octocat");

这是来自github上的例子。
言归正传,Retrofit不是一个网络访问客户端,它是httpClint的力量增幅器。它只做3件事:
1.解析接口来形成请求。
2.把请求扔给别人去做。(和okhttp有一腿)
3.把返回的结果扔给各种各样的解释器。


  • Retrofit的一些写法

    对于基础地址不同的时候,直接创建两个Retrofit对象会使得事实上创建了两个隔离的httpClient。像下面的写法会带来一些小问题:

    这里写图片描述

    比如这样的例子中的httpClient选择为okhttp 就让okhttp的一些优秀特性无法发挥。比如说okhttp 的Rawdatabase会记得连接服务器的最佳方式,各种各样的信息存在于httpClient的对象中,多次创建会使信息无法共享。

    解决方案:new okhttpClient()扔出去。

    这里写图片描述

    对于需要修改okhttpclient时,可以使用:

    这里写图片描述

    不过说是这样说,基础地址都不同了,逻辑上联系应该也没什么联系。分开写也没什么问题,当然,如果需要信息共享的话。可以用以上的方法

    有些请求需要添加请求头的情况(比如说用户认证)
    一种方式是实现自定义的Intercepter中判断,获得encodePath然后每有一个判断一次。原本分离的两样东西因为逻辑联系在了一起,改接口intercepter也要改,岂不是不理想。
    这里写图片描述

    解决方案:添加对服务器无意义的header,然后在intercepter中获取判断:

    这里写图片描述

    我的天,我讨厌水印,但并不知道怎么去,也找不到直接获取网络图片地址的方法,求各位大牛告知。

  • *Retrofit中的解释器(Converter)
    作用:JavaBean 与 bits的相互转换
    添加方式:.addConverterFactory();
    注意:可添加多个,前面的converterfactory优先级高,处理不了才往下传。json和xml的converterfactory几乎可以处理一切,所以尽量往后放。

    在Retrofit中Call默认的类型为ResponseBody ,可以通过添加Converter的形式改变。
    详情请看GitHub上的文档

    注意simplexmlconverter 的Android Studio添加方式:
    compile(“com.squareup.retrofit2:converter-simplexml:2.2.0”)
    {
    exclude module: ‘stax’
    exclude module: ‘stax-api’
    exclude module: ‘xpp3’
    }


  • Converter在使用中可能出现的一些问题

    不同基础地址,解决方案:
    这里写图片描述

    大神提到了Gson gson = new Gson() 的创建花费很高,GsonConvertFactory的花费几乎没有。

    对于返回结果的解析:
    这里写图片描述

    多种请求的处理,json,xml
    因为这两种格式的converterfactory都比较强势,以至于写在一起时总是先到先得。
    解决方案:自定义converter,添加自定义注解。或者把接口分离。
    这里写图片描述

    整体给人的感觉就是,通过各种converter可以处理掉大多数的来自于奇怪的API的问题。


  • Retrofit新思路—非接口网络请求

    这是我最激动的一部分,因为接触安卓不久之后,我就试着开始解析网络上的东西,然后把他们下载下来自己欣赏。写了一大堆一大堆的垃圾代码。Jack Wharton 介绍了一个交Plain 的APP。

    实现思路:把浏览器当成httpclient以及解释器,外来的网页作为数据源。浏览器发送请求到外来服务器,服务器返回html,浏览器解析成为界面。

    这里写图片描述

    当然,既然是别人的东西,没有稳定的API,这样的APP会时不时崩溃的吧。以前我自己写的就崩溃过一次,从一堆可用的垃圾代码,变成不可用的垃圾代码。很痛苦,找不到解决方案,晚上睡不着,非常的气。后来随着学习的深入,问题解决了,但是下一次爆炸只是时间问题,希望那时的我变得足够的强吧。

    之后还讨论了RxJava 和 Retrofit 联合使用 ,把Call 转化为Observerable ,以及Mock Mode 模拟网络情况 等内容。

    最近公司需要使用WebService Soap ,看了一波 ksoap2 的源码,发现到头来还是封装的网络请求,也看到了网上的 Retrofit Soap解决方案 ,试着自己写一写,看看可不可以简单一些。
    个人github地址,现在全是垃圾代码,唯二的星星是自己标上去的,如果一切顺利,以后会有一些比较理想的东西吧。

1 0