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的设计思路的更多相关文章

  1. Tomcat 第三篇:总体架构设计

    Tomcat 总体架构设计 在开始这篇文章的时候,忽然发现上一篇内容的题目不是很合适,不应该叫启动流程,更确切的应该是叫启动脚本. 在最开始,先介绍下 Tomcat 的总体设计,先有一个大概的印象,对 ...

  2. asp.net abp模块化开发之通用树2:设计思路及源码解析

    一.前言 上一篇大概说了下abp通用树形模块如何使用,本篇主要分析下设计思路. 日常开发中会用到很多树状结构的数据,比如:产品的多级分类.省市区县,大多数系统也会用到类似“通用字典/数据字典”的功能, ...

  3. 【摸鱼神器】UI库秒变LowCode工具——列表篇(一)设计与实现

    内容摘要: 需求分析 定义 interface 定义 json 文件 定义列表控件的 props 基于 el-table 封装,实现依赖 json 渲染 实现内置功能:选择行(单选.多选),格式化.锁 ...

  4. iOS开发:代码通用性以及其规范 第二篇(猜想iOS中实现TableView内部设计思路(附代码),以类似的思想实现一个通用的进度条)

    在iOS开发中,经常是要用到UITableView的,我曾经思考过这样一个问题,为什么任何种类的model放到TableView和所需的cell里面,都可以正常显示?而我自己写的很多view却只是能放 ...

  5. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

    TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...

  6. [三]java8 函数式编程Stream 概念深入理解 Stream 运行原理 Stream设计思路

    Stream的概念定义   官方文档是永远的圣经~     表格内容来自https://docs.oracle.com/javase/8/docs/api/   Package java.util.s ...

  7. IM开发基础知识补课(七):主流移动端账号登录方式的原理及设计思路

    1.引言 在即时通讯网经常能看到各种高大上的高并发.分布式.高性能架构设计方面的文章,平时大家参加的众多开发者大会,主题也都是各种高大上的话题——什么5G啦.AI人工智能啦.什么阿里双11分分钟多少万 ...

  8. 一年三篇IF大于7的牛人告诉你怎么写SCI

    一年三篇IF大于7的牛人告诉你怎么写SCI 1 研究生必备四本 俗话说好记性不如烂笔头,所以一定要首先养成做笔记的好习惯!作为研究生下面这几个本子是必不可少的: 1.实验记录本(包括试验准备本),这当 ...

  9. EventStore的设计思路

    EventStore的设计思路 最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event ...

随机推荐

  1. xml 方式更新和获取 配置文件 appSettings 节点 解决办法

    最近在搞一个小程序,会用到动态修改配置文件来进行处理,在百度上找了很多办法,但是始终达不到我预想的效果,先列出程序运行环境和开发工具版本: 开发工具:VS2010 .Net 运行环境:4.0 有两种方 ...

  2. jmeter+ant+jenkins+mac环境搭建

    一.环境准备 1.JDK环境:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.ANT环境:http://ant ...

  3. RDCManager(远程登录工具)

    1: 2: 3: 4: 5 6 写文不易,转载请注明出处:http://www.cnblogs.com/zszs/p/5662752.html

  4. 【Java】需要注意的小细节

    一.==和equals 1.比较两个变量时 a.==可以判断两个变量是否相等,如果两个变量是基本类型变量,而且是数值类型,只要两个变量值相等,返回true. 2.比较两个引用变量 a.==只有两个引用 ...

  5. jsp中jstl标签的类似 if - else 语句 的语法

    在jsp中引入jstl的标签库和函数库 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c&q ...

  6. 金融IC卡 ARQC和ARPC计算方法和实例(转)

    假设发卡行的IC卡应用密钥如下:   PBOC_IMK_AC               F0C34A8124CEE0A91A0B034AA97D6EAC PBOC_IMK_ENC           ...

  7. IOC理解

    控制反转(反转控制):谁控制了谁? 就是交换控制权1.A a =new A();   要使用这个A 必须你去new他.控制权在a2.由第三方来进行创造这个A,你用的时候直接用就是.控制权在第三方. 3 ...

  8. VB发送后台按键和组合键

    http://files.cnblogs.com/files/liuzhaoyzz/VB%E5%8F%91%E9%80%81%E5%90%8E%E5%8F%B0%E7%BB%84%E5%90%88%E ...

  9. java模拟面试 试题

    java 四类八种基本数据类型 第一类:整型 byte short int long 第二类:浮点型 float double 第三类:逻辑型 Boolean(取值为 true false) 第四类: ...

  10. display:inline、block、inline-block的区别

    display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度不设是它的容器的100%,除非设定一个宽度 <div& ...