第三篇: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 ...
随机推荐
- 简述jpg。Gif。png-8.png-24的区别,分别使用场景
gif.jpg.png格式的图片在网站制作中的区别 一.Gif格式特点: 1.透明性,Gif是一种布尔透明类型,既它可以是全透明,也可以是全不透明,但是它并没有半透明(alpha透明). 2.动画,G ...
- 为什么当多个inline-block的div中,如果有的div没有内容而有的div有内容,有内容的会下沉?
为什么当多个inline-block的div中,如果有的div没有内容而有的div有内容,有内容的会下沉? 就像这样 两个div高度相同,第二个我写了一个1当作 有内容吧,它就下沉了... 奇怪... ...
- [POJ3111]K Best(分数规划, 二分)
题目链接:http://poj.org/problem?id=3111 求选k对数,使得上述式子值最大.容易想到设左边为一个值,对式子变形以下,得到sigma(v-r*w))==0的时候就是最大的,& ...
- codeforces 754D. Fedor and coupons
D. Fedor and coupons time limit per test 4 seconds memory limit per test 256 megabytes input standar ...
- jQuery 遍历方法
http://www.runoob.com/jquery/jquery-ref-traversing.html
- Struts2配置Result(Struts2_result)
一.概要 二.常用四种类型的配置 Struts.xml <?xml version="1.0" encoding="UTF-8" ?> <!D ...
- MCU的四个功能
以下来自Atmel Mega128的说明手册: 微控制器(微处理器)Microcontroller(MCU)的四个基本功能为: 1. access memory, 2. perform calcul ...
- linux rpm -ivh MySQL-server-5.5.31-2.el6.i686.rpm
linux rpm 安装mysql异常: [root@localhost upload]# rpm -ivh MySQL-server-5.5.31-2.el6.i686.rpmerror: Fail ...
- text-transform属性
text-transform -- 定义文本的大小写状态,此属性对中文无意义 取值:capitalize | uppercase | lowercase | none | inherit capita ...
- BeautifulSoup学习笔记
1.如果tag最内层只有一个 NavigableString 类型子节点,那么这个tag可以直接使用tag.string 得到子节点 # encoding=utf-8 from bs4 import ...