第三篇:Retrofit SDK的设计思路
2016-05-08 15:24:03
Retreofit毫无疑问是一个优美的开源框架,有轻量级、耦合性低、扩展性好、灵活性高的特点,那么Retrofit的设计者们到底是怎么样做到这些的呢?我希望能够通过逆推的方式,探究一下Retrofit设计者们的设计思路和实现方案。
1. 什么是Retrofit
如其官网所说,“Retrofit,A type-safe HTTP client for Android and Java”。
2. 用户群
基于Retrofit自身的定位,它的用户群应该是需要Http Client来开发网络应用的Android或者Java Developer。
3. 要解决的问题
Http框架有很多,比如okhttp,但是使用类似okhttp这样的框架要编写大量的代码用于构建Request、线程处理、参数编码、超时控制、网络状态判断、数据解析等任务,如何以一种更优雅的方式来解决这些开发过程的痛点,Retrofit应用而生。所以Retrofit要解决的问题就是:编写一个易用、安全、轻量级的框架来解脱繁琐的网络请求代码对Developer的束缚。幸运的是Retrofit做到了。
4. Retrofit的边界
Retrofit只能用于执行RESTful网络请求以及解析返回数据,但是它本身不做真正的网络请求,这是okhttp的工作。Retrofit 1.9版本需要我们自己引入okhttp,并非强制,如果不引入会使用系统的HttpClient或者HttpUrlConnection。Retrofit 2.0.0会默认引入并强制使用okhttp3,或者实现okhttp3.Call接口的call factory。
5. 兼容性
Retrofit兼容性做的很差,2.0.0之后的版本和之前的版本完全无法兼容,主要是因为Retrofit在最近发布2.0.0之前已经好几年没有更新过了。
6. 轻量级、易用性和扩展性...
通过前面的分析,Retrofit确实是一个轻量级的、容易使用的并且扩展性很好的Http Client。那么作者是如何实现这些目的的呢?要知道,这几点说起来容易,可要真正做好,简直太难了。个人觉得有以下几点:
6.1 Retrofit定位准确,做自己擅长的事情,引入了第三方Http网络请求(2.0.0之后强制使用OkHttp3);
6.2 真正站在SDK user的角度贴心设计,因此不仅非常容易使用,而且对客户端代码的侵入做到了最小;
6.3 合理的使用设计模式,恰如其分的设计让Retrofit有极强的扩展性;
6.4 更加合理的拆分,2.0.0将CallAdapter和Converter拆分为独立模块,一方面能做到更加的轻量级,同时更加的便于扩展;
Retrofit确实是一个伟大的SDK,但是也难免有瑕疵,个人觉得最大的瑕疵在于:
1. 将retrofit.Call adapt为用户需要的返回类型,代码设计让人无法理解:

2. 强制使用okhttp
毫无疑问,okhttp是一个非常优秀的HTTP开源框架,但是开源世界被强制使用某种东西,这毫无疑问是违背开源精神的。
3. 兼容性
可能真的是由于2.0.0和前一个版本间隔时间太长了,Retrofit的兼容性几乎为0,作为一个影响力如此巨大的开源框架,有点不负责任的嫌疑。
OK,Retrofit系列文章到此告一段落,其实除了深入阅读源码探究Retrofit调用流程和作者的设计思路之外,Retrofit团队在编码细节方面做的非常棒,非常值得学习。总之,Retrofit是一个极优秀的Http开源框架,谁用谁知道~
第三篇:Retrofit SDK的设计思路的更多相关文章
- Tomcat 第三篇:总体架构设计
Tomcat 总体架构设计 在开始这篇文章的时候,忽然发现上一篇内容的题目不是很合适,不应该叫启动流程,更确切的应该是叫启动脚本. 在最开始,先介绍下 Tomcat 的总体设计,先有一个大概的印象,对 ...
- asp.net abp模块化开发之通用树2:设计思路及源码解析
一.前言 上一篇大概说了下abp通用树形模块如何使用,本篇主要分析下设计思路. 日常开发中会用到很多树状结构的数据,比如:产品的多级分类.省市区县,大多数系统也会用到类似“通用字典/数据字典”的功能, ...
- 【摸鱼神器】UI库秒变LowCode工具——列表篇(一)设计与实现
内容摘要: 需求分析 定义 interface 定义 json 文件 定义列表控件的 props 基于 el-table 封装,实现依赖 json 渲染 实现内置功能:选择行(单选.多选),格式化.锁 ...
- iOS开发:代码通用性以及其规范 第二篇(猜想iOS中实现TableView内部设计思路(附代码),以类似的思想实现一个通用的进度条)
在iOS开发中,经常是要用到UITableView的,我曾经思考过这样一个问题,为什么任何种类的model放到TableView和所需的cell里面,都可以正常显示?而我自己写的很多view却只是能放 ...
- TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析
TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...
- [三]java8 函数式编程Stream 概念深入理解 Stream 运行原理 Stream设计思路
Stream的概念定义 官方文档是永远的圣经~ 表格内容来自https://docs.oracle.com/javase/8/docs/api/ Package java.util.s ...
- IM开发基础知识补课(七):主流移动端账号登录方式的原理及设计思路
1.引言 在即时通讯网经常能看到各种高大上的高并发.分布式.高性能架构设计方面的文章,平时大家参加的众多开发者大会,主题也都是各种高大上的话题——什么5G啦.AI人工智能啦.什么阿里双11分分钟多少万 ...
- 一年三篇IF大于7的牛人告诉你怎么写SCI
一年三篇IF大于7的牛人告诉你怎么写SCI 1 研究生必备四本 俗话说好记性不如烂笔头,所以一定要首先养成做笔记的好习惯!作为研究生下面这几个本子是必不可少的: 1.实验记录本(包括试验准备本),这当 ...
- EventStore的设计思路
EventStore的设计思路 最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event ...
随机推荐
- ubuntu gtk2.0 一个简单完整的窗口
//gtk_main();开了线程,关闭窗口并不能退出程序,需要手动添加 //gtk2.0,window quit compelete example #include <gtk/gtk.h&g ...
- JavaACOFramework的各个类介绍(part1 : Ant类)
public abstract class Ant extends Observable implements Runnable { public static int ANT_ID = 1; // ...
- JavaScript数组类型
特点 动态长度 一个数组里面的元素可以是不同类型 数组的length属性不是只读属性,可通过length延长数组也可以删减数组的长度 定义数组两种方法 //方法一: var names = new A ...
- struts2漏洞集合
[+]1 S2-005 CVE-2010-1870 CVE-2010-1870 影响版本:Struts 2.0.0 – Struts 2.1.8.1 官方公告:http://struts.apache ...
- IOS 微信 6.5.2 自动播放音乐 解决方案
之前仅仅是IPhone7\7p 的问题,现在已经扩展到6 .6s.今天在下也行了最新微信,音乐问题果然来了. 好了 下面直接进入正题 首先 引入 <script src="http:/ ...
- MySQL存储IP地址操作
数据库数据表创建语法: DROP TABLE IF EXISTS `admin`; CREATE TABLE IF NOT EXISTS `admin`( `adminid` INT UNSIGNED ...
- springMVC+mybatis+spring整合案例
1.web.xml a:配置spring监听,使web容器在启动时加载spring的applicationContext.xml <listener> <listener-class ...
- Android 自定义Adapter 但listview 只显示第一条数据
<ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content ...
- 如何在页面进入时就加载js
页面一打开就执行JS的代码! onLoadwindow.onLoad=function(){}window.onload=function(){ } 补充:window.onload和doucumen ...
- express+gulp构建项目(三)gulp任务
这次来看一看gulp是怎么工作的. tasks/paths.js paths.js文件里存放的是gulp任务中需要导入的文件的路径和导出的路径. /** * gulp.src 地址 * gulp.de ...