让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地址,现在全是垃圾代码,唯二的星星是自己标上去的,如果一切顺利,以后会有一些比较理想的东西吧。
- 让Retrofit 2.0为你效命by Jake Wharton
- 用 Retrofit 2 简化 HTTP 请求(Jake Wharton)
- Jake Wharton之ViewPagerIndicator解读预备役
- Jake Wharton 最近的一篇技术分享:Java Hidden Costs
- 听Jake Wharton讲如何成为更优秀的开发者与创建一个成功的开源项目
- 带你一起探究Retrofit 源码,让你不再畏惧Retrofit的面试提问
- 为Retrofit 2.0 添加缓存
- 使用MVP+Retrofit+rxjava让你的代码更简洁
- 让世界为你转身
- Retrofit by Tamic -- 码小白
- Dagger(该篇为dagger1,即square公司出Jack Wharton领导的开源框架)
- 理财新思路:让银行为你打工
- 让XDoclet为你写存根类
- 让自动交易为你工作
- 让工作环境为你服务(笔记)
- [转]《谁让你是飞鸟我是鱼》by(晨曦)
- 使用Retrofit和Rxjava让你的网络请求更简单
- 使用Retrofit和Rxjava让你的网络请求更简单
- MyEclipse中常用的快捷键大全
- c++函数模板和类模板实例
- 简单爬虫编写Python篇(1)
- 推荐15个很优秀的跨平台的移动开发工具
- Java正则替换汉字中文字符串
- 让Retrofit 2.0为你效命by Jake Wharton
- 残缺棋盘 【分治】
- Java分类显示。
- okhttp Fatal Exception thrown on Scheduler.Worker thread问题解决
- javascript正则表达式
- 机器学习和PHP的神经网络:PHP-ML库
- 第四届蓝桥杯有理数类
- ACM_HDU 1060+1061 leftmost or rightmost digit(数论)
- dom03隔行变色