Retrofit源码解析(一)

   2016-09-18 0
核心提示:本人以前写的Android网络框架时介绍过Retrofit,原文在这里,也做过对Retrofit库进行简单的封装工作, Github源码再 这里 , 在这里就不多说了。当时使用的时候简单看了一些源码,发现源码中大量使用设计模式,包括Facade、Factory、Proxy、Strategy、Adapter

本人以前写的Android网络框架时介绍过Retrofit,原文在这里,也做过对Retrofit库进行简单的封装工作, Github源码再 这里 , 在这里就不多说了。当时使用的时候简单看了一些源码,发现源码中大量使用设计模式,包括Facade、Factory、Proxy、Strategy、Adapter、Observer等等,是我辈学习设计模式的好案例。当然Android源码也大量用设计模式, 只是太分散了。

不要为了设计而设计

在这里多说一些, 不要为了设计模式而设计,相反是因为写也块的时候,正好可以能用这种设计模式而已, 总之好的代码是重构出来的,不是设计出来的

就像金庸武侠小说里风清扬的独孤九剑一样, 虽然只有短短的九个招式, 但每个招式又有不同的变化。这也是为什么比较喜欢C语言的地方, 语法就那么简单,但不同的组合就能干任何事情。

如何阅读源码

本人一直的观点是” 授人予鱼、不如授人予渔 ”,这是我写这些的东西的目的之一。其实没有太多的技巧, 就是死磕,但是要有策略的死磕。好吧, 你们有福了, 正好最近看到一篇相关的,里面也讲一些有用的技巧,分享给大家:

与编程一样,阅读别人的源代码永远不是一件轻松的事,或者说,是一件困难的事情,需要持续的投入,阅读、研究、把玩、实践。很多人觉得拿到了源代码就像买了本书一样,放到书柜上,马上就有种学会了的感觉,但真正实践起来才会体验到强烈的挫败感。大部分情况下,读不下去,不是方法不好,而是投入度不够。

阅读源代码,一定要找到好的开源项目。什么是好的项目?口碑好且应用广泛的项目就是好项目,比如 Docker、Spring、OpenResty,都是非常好的阅读素材。另外,完善的文档和足够的 test case 覆盖率,都是衡量一个开源项目是否优秀的标准。很多人说,代码即文档,好的代码本身就是自解释的。但是,对于规模宏大的开源软件来说,没有文档是不可想象的。 所以在阅读源代码之前,一定要读文档。尽管读了文档之后,你可能不知道代码的技术细节,但至少可以了解项目的轮廓。结合开源项目的代码目录,差不多可以绘制出一个粗粒度的整体架构图

然后为每个目录(或模块)做记录和标识,逐一阅读,或者直接去读你最感兴趣的部分。

我读源代码喜欢自顶向下的方式,先把整体脉络理清楚,然后按照模块去阅读代码,把类和类、函数和函数之间的调用关系记录下来,如果可以进行逆向工程,用类似 Intelli IDEA 这样的工具把代码之间的调用关系用 Diagrams 展现出来,阅读会更加直观一些。

另外,阅读 test case 同样能帮助你理解作者的代码设计意图,正常情况下,测试用例都是从文档和设计衍生出来的,而不是完成了代码再写 test case。阅读测试用例,可以让你更清晰的知道对应的类和函数想要做什么事情(笔者注:测试用例很重要)。

阅读源代码需要顺手的工具,我自己喜欢用 Vim,配合 NERDTree、Cpmmand-T、ctags、taglist 等插件,Vim 可以成为一款优秀的代码浏览工具,而且非常轻量级。你可以通过命令行迅速打开、关闭、查找和索引程序,并进行有效的关联跳转(静态代码)。如果你不习惯,也可以用 Sublime Text,Atom 等工具。当然,如果你要进行调试和跟踪,那最好使用相关程序栈的 IDE 工具了,比如 Eclipse、Jet Brain 系列工具,Xcode 等,这样你可以在 debug 状态跟踪所有的函数调用和变量参数在执行时间线上的变化。(笔者注:Emacs也很好,也是本人比较喜欢的)

重复一句,工具和方法永远不是最重要的,去读,并在遇到困难的时候,看不明白的时候,咬牙坚持下去,抽丝剥茧,逐个击破。最终,你会在冰冷黑暗的二进制世界里面看到一张地图,找到一座灯塔,然后去解释和还原这个底层世界里每一个细微方面的语义,重建出高层次的抽象概念和关系(这个观点和笔者一致)。

正文

上面扯了那么多还没进正文, 看来要分两篇来下了,本文主要分析的源码版本是2.0。

Retrofit 可以分为注解解析(Request 生成),请求执行,请求回调(异步处理),响应体转化几个部分。其中请求执行与请求回调可以算作一个部分,并且请求回调也可以没有,同步请求操作Call 直接执行的接口 execute。

还是上一张详细的设计图把, 这里偷一下懒吧, 不自己画了, 这个以前帖过,现在版本总体设计没有什么变化。

Retrofit源码解析(一)

主要是围绕着 converter,CallAdapter 设计的整个框架,剩下的下篇再说吧!

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • [Java] Retrofit2.0 如何进行GBK编码
    对Retrofit + OkHttp还不熟悉的人可以点传送门,先看下这两个东西的使用。Retrofit:https://github.com/square/retrofitOkHttp:https://github.com/square/okhttp分析接口文档要求Post请求,字段使用GBK编码我们先按照Retrofit的规范和接口文档来写接口: @PO
    12-23 RetrofitJava
  • Android常用的开源项目及其比较系列-Retrofit进
    上一篇我们谈了谈Androiod开源项目的网络框架, 比较了它们之间的优缺点,原文在这里。今天我们着重谈谈Retrofit框架如何更友好的使用,本着提出问题解决问题的原则,也为大家以后解决问题提供基本思路。目前都有哪些问题?根据官方Demo, 简单使用是这么样的
  • Android MVP架构实践
    Android MVP架构实践
    首先声明一下,没有完美的架构,只要适合自己的项目,那就是最好的架构。本例子是MVP + Retrofit + RxJava结合的例子,但本文的重点在于讲解MVP架构,所以涉及Retrofit和RxJava的部分将直接略过,默认读者已了解这两部分内容,如有需要,请自行查阅相关资料,
  • 从 Retrofit 源码学习 Java 的动态代理的使用
    Retrofit 是当前 Android 最流行的 HTTP 网络库之一了,其使用方式比较特殊,是通过定义一个接口类,通过给接口中方法和方法参数添加注解的方式来定义网络请求接口。这种风格下定义一个网络接口变得很简单。不过 Retrofit 是如何使用一个接口的 Class 创建出
    11-13 RetrofitJava
  • 打造企业级网络请求框架集合 retrofit+gson+mvp
    打造企业级网络请求框架集合 retrofit+gson+m
    本文是企业级网络框架第二篇主要讲MVP模式和Gson在Retrofit网络请求框架下的使用方式。(已更新为一篇) 对MVP不了解的请看梦之鬼索MVP模式在Android中的设计和实现 http://blog.csdn.net/androidmsky/article/details/52248797 对Retrofit还不了解的情看 打
    10-31 RetrofitGson
  • Retrofit分析之框架设计艺术
    Retrofit分析之框架设计艺术
    Retrofit使用者会觉得接口+注解方式去写网络请求很吊。但当你真正的去看它的源码,会被它独特,漂亮的解耦方式所吸引,整个结构运用了动态代理,策略模式,Builder模式,工厂等设计模式。Retrofit v2.1基于Okhttp3,可以说是对okhttp进行二次封装。先感受一下
    10-07 Retrofit
  • Android Retrofit框架解析
    随着Google对HttpClient的摒弃,和Volley的逐渐没落,OkHttp开始异军突起,而Retrofit则对okHttp进行了强制依赖。Retrofit也是Square公司开发的一款针对Android网络请求的框架,其实质就是对okHttp的封装,使用面向接口的方式进行网络请求,利用动态生成的代理类
    10-04 Retrofit
  • Android网络开源库-Retrofit(五)简易封装
    1.前言Rrtrofit的扩展性很强,如果对retrofit不熟悉的话,是很难应对各种各样的需求的。因此,在这里,做一下简单的封装。主要为了下面三点需求:使用简单加密处理错误处理2.怎样才能简单使用为了简单粗暴,我做了以下工作。使用单例Retrofit引入RxJava在这里
  • Android网络开源库-Retrofit(四)文件相关
    以前写过一些retrofit的相关文章,当时只是自己学习研究的,最近项目,加入了retrofit,因此遇到了一些问题,需要记录一下。1.前言在以前,写过retrofit上传文件相关,但是,需求总是变化的。前面的,介绍了上传进度的监听,但是,那时候是监听单文件进度。虽
  • 急速开发系列——Retrofit 响应数据及异常处理
    今天我们来谈谈客户端对通讯协议的处理,主要分为三部分:约定响应数据格式,响应数据的自动映射以及错误处理三部分。由于数据协议采用json的居多,因此我们在此基础上进行说明。约定响应数据格式协议格式通常来说,你拿到的设计文档中会存在通信协议的说明,
    09-29 RetrofitGson
点击排行