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开源框架,谁用谁知道~

 posted on 2016-05-08 21:11  wlrhnh  阅读(512)  评论(0编辑  收藏  举报