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. 【翻译】利用Qt设计师窗体在运行时创建用户界面(Creating a user interface from a Qt Designer form at run-time)

    利用Qt设计师窗体在运行时创建用户界面 我们利用Calculator窗体例子中创建的窗体(Form)来展示当一个应用(application)已经生成后,是可以在其运行时产生与例子中相同的用户界面. ...

  2. python学习之深入

    一.迭代器和生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. ...

  3. gradle相关配置内容解析

    gradle 项目的构建工具,基于groovy语言.主要用于管理依赖包. as中一般将gradle下载在C:\Documents and Settings<用户名>.gradle\wrap ...

  4. C#利用服务器实现客户端之间通信

    这两天在学习C#,C#高级编程真的是厚厚的一本书QAQ. 昨天看了一下里面的通信部分(其实还没怎么看),看了网上一些人的博客,自己在他们的博客基础上写了一个通信. 先来讲述下我自己对于整个Socket ...

  5. python成长之路【第十五篇】:JavaScript初步认识

    JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 一.如何编写 1.J ...

  6. IOS开发之GCD---dispatch_semaphore

     信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待.当一个信号量被信号通知,其计数会被增加.当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零, ...

  7. NotePad++常用快捷键。——Arvin

    Ctrl+单键 Ctrl+C 复制 Ctrl+X 剪切 Ctrl+V 粘贴 Ctrl+Z 撤消 Ctrl+Y 恢复 Ctrl+A 全选 Ctrl+F 键查找对话框启动 Ctrl+H 查找/替换对话框 ...

  8. OpenCV计算点到直线的距离 数学法

    我们在检测图像的边缘图时,有时需要检测出直线目标,hough变换检测出直线后怎么能更进一步的缩小区域呢?其中,可以根据距离来再做一判断,就涉及到了点与直线的距离问题. 点到直线距离代码如下: //== ...

  9. JQuery筛选器全系列介绍

    jQuery提供了强大的选择器让我们获取对象.在这边,我人为地将jQuery选择器分为两大部分:选择对象和筛选条件.选择对象表示要获取什么对象,筛选条件是对获取的对象进行筛选,最终留下符合某些特征的对 ...

  10. iOS适配https详解

    马上就要元旦了,网上流传元旦之后苹果会对所有的app进行https的验证,据说会拒绝所有没有使用https的app.但是后来又听说是我们开发者误解了,元旦过后还是会支持http,不过开发者需要说明为什 ...