Android Retrofit 源码分析

这篇具有很好参考价值的文章主要介绍了Android Retrofit 源码分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、retrofit 是什么?

Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。 网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装。

Android Retrofit 源码分析,网络编程,android,android,retrofit

1)App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求 参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作。

2)在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用 户的需求对结果进行解析。

二、retrofit 总流程:

Android Retrofit 源码分析,网络编程,android,android,retrofit

1)通过解析网络请求接口的注解,配置网络请求参数;

2)通过动态代理生成网络请求对象;

3)通过网络请求适配器将网络请求对象进行平台适配;

4)通过网络请求执行器发送网络请求;

5)通过数据转换器解析服务器返回的数据;

6)通过回调执行器切换线程(子线程 ->>主线程);

7)用户在主线程处理返回结果。

三、代理实例创建过程

Android Retrofit 源码分析,网络编程,android,android,retrofit

1:成功建立一个Retrofit对象的标准:配置好Retrofit类里的成员变量

baseUrl:网络请求的url地址

callFactory:网络请求工厂

callbackExecutor:回调方法执行器

adapterFactories:网络请求适配器工厂的集合

converterFactories:数据转换器工厂的集合

Android Retrofit 源码分析,网络编程,android,android,retrofit

2:创建了一个ISharedListService接口类的对象,create函数内部使用了动态代理来创建接口对象,这样的设计可以让所有的访问请求都被代理。

通过 Retrofit. create( ciass)方法创建出 Service interface 的实例,从而使得 Service 中配置的方法变得可用,这是 Retrofit 代码结构的核心;Retrofit.create()方法内部,使用的是Proxy.newProxylnstancef)方法来创建Service 实例。这个方法会为参数中的多个 interface (具体到 Retrofit 来说,是固定传入一个interface)创建一个对象,这个对象实现了所有 interface 的每个方法,并且每个方法的实现都是雷同的:调用对象实例内部的一个工 nvocationHandler 成员变量的 invoke()方法,并把自己的方法信息传递进去。这样就在实质上实现了代理逻辑:interface 中的方法全部由一个另外设定的 InvocatioriHandler 对象来进行代理操作。并且,这些方法的具体实现是在运行时生成 interface 实例时才确定的,而不是在编译时(虽然在编译时就已经可以通过代码逻辑推断出来)。这就是动态代理机制的具体含义。

四、访问接口创建过程

Call<SharedListBean>sharedListCall=sharedListService.getSharedList(2,1);

调用getSharedList的时候,在动态代理里面,会存在一个函数getSharedList,这个函数里面会调用invoke,这个invoke函数也就是retrofit里面invoke函数。所以,动态代理可以代理所有的接口,让所有的接口都走invoke函数,这样就可以拦截调用函数的执行,从而将网络接口的参数配置归一化。

Android Retrofit 源码分析,网络编程,android,android,retrofit

五、网络请求过程

converter response2javaBean 

Android Retrofit 源码分析,网络编程,android,android,retrofit

Android Retrofit 源码分析,网络编程,android,android,retrofit

六、设计模式 

1)Retrofit 实例使用建造者模式通过Builder类构建。当构造函数的参数大于4个,且存在可选参数的时候既可以使用 建造者设计模式;

2)Retrofit 创建时的callFactory,使用工厂方法设计模式,但是似乎并不打算支持其他的工厂;

3)整个retrofit 采用的时外观模式。统一的调用创建网络请求接口实例和网络请求参数配置的方法;

4)Retrofit里面使用了动态代理来创建网络请求接口实例,这个是retrofit对用户使用来说最大的复用,其它的代码都是为了支撑这个动态代理给用户带来便捷性的;

动态代理和静态代理的区别?

静态代理类由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

动态代理类是在程序运行期间由 JVM 根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。

静态代理:

静态代理业务类只需要关注业务逻辑本身,保证了业务类的重用性。代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,需要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法,增加了代码维护的复杂度。

动态代理:

动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler invoke)。这样,在接口方法数量比较多的时候,可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使类职责更加单一,复用性更强。

5)使用了策略模式对serviceMethod对象进行网络请求参数配置,即通过解析网络请求接口方法的参数、返回值和注解类型,从Retrofit对象中获取对应的网络的url地址、网络请求执行器、网络请求适配器和数据转换器;

6)ExecuteCallBack 使用装饰者模式来封装callbackExecutor,用于完成线程的切换;

7)ExecutorCallbackCall 使用静态代理(委托) 代理了Call进行网络请求,真正的网络请求由okhttpCall执行,然而okHttpCall不是自己执行,它是okhttp 提供call给 外界(retrofit)使用的唯一门户,其实这个地方就是门面模式;

8)ExecutorCallbackCall 的被初始化是在 ExecutorCallAdapterFactory里面通过适配器模式被创建的。CallAdapter采用了适配器模式 为创建访问Call接口提供服务。默认不添加Rxjava则使用默认的ExecutorCallAdapterFactory 将okhttp3.call转变成为 retroift中的call,如果有Rxjava则将okhttp3.call转化为abservable。

七、总结

Retrofit 通过 java 接口以及注解来描述网络请求,并用动态代理的方式生成网络请求的 request,然后通过 client 调用相应的网络框架(默认 okhttp)去发起网络请求,并将返回的 response 通过 converterFactorty 转换成相应的数据 model,最后通过 calladapter 转换成其他数据方式(如 rxjava Observable等)。

Android Retrofit 源码分析,网络编程,android,android,retrofit

Retrofit 优点:

可以配置不同 HTTP client 来实现网络请求,如 okhttp、httpclient 等;

请求的方法参数注解都可以定制;

支持同步、异步和 RxJava;

超级解耦;

可以配置不同的反序列化工具来解析数据,如 json、xml 等;

框架使用了很多设计模式。文章来源地址https://www.toymoban.com/news/detail-639993.html

到了这里,关于Android Retrofit 源码分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Retrofit 源码解析

    在 Android 开发中,Retrofit 是一个非常流行的网络请求库。它是由 Square 开发的,用于 简化 Android 应用程序与网络服务器之间的通信 。 Retrofit 主要用于处理 RESTful API 的网络请求。它通过将 HTTP 请求与 Java 接口方法进行映射,使得网络请求的编写变得简单和直观。使用 Retrofit,

    2024年02月13日
    浏览(37)
  • Android---Retrofit实现网络请求:Kotlin版

    在 Android 开发中,网络请求是一个极为关键的部分。Retrofit 作为一个强大的网络请求库,能够简化开发流程,提供高效的网络请求能力。 Retrofit 是一个建立在 OkHttp 基础之上的网络请求库,能够将我们定义的 Java 接口转化为相应的 HTTP请求,Retrofit 是适用于 Android 和 Java 的类

    2024年02月20日
    浏览(43)
  • Go语言网络编程:HTTP服务端之底层原理与源码分析——http.HandleFunc()、http.ListenAndServe()

    在 Golang只需要几行代码便能启动一个 http 服务,在上述代码中,完成了两件事: 调用 http.HandleFunc 方法,注册了对应于请求路径 /ping 的 handler 函数 调用 http.ListenAndServe,启动了一个端口为 8999 的 http 服务 2.1 server 结构 Addr :表示服务器监听的地址。如\\\":8080\\\"表示服务器在本地

    2024年02月08日
    浏览(62)
  • Android笔记(十八):面向Compose组件结合Retrofit2和Rxjava3实现网络访问

    Square公司推出的Retrofit2库(https://square.github.io/retrofit/),改变了网络访问的方式。它实现了网络请求的封装。Retrofit库采用回调处理方式,使得通过接口提交请求和相应的参数的配置,就可以获得对应的响应,并可以将响应获得的数据解析成特定的数据格式,例如将JSON数据解

    2024年02月02日
    浏览(39)
  • 【网络编程】高性能并发服务器源码剖析

      hello !大家好呀! 欢迎大家来到我的网络编程系列之洪水网络攻击,在这篇文章中, 你将会学习到在网络编程中如何搭建一个高性能的并发服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解,希望能让大家更能了解网络编程技术!!! 希望这篇文章能

    2024年04月15日
    浏览(56)
  • 【网络编程知识】什么是Socket?概念及原理分析

    先来看一下 百度百科 介绍 套接字(Socket) ,就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程

    2024年02月09日
    浏览(38)
  • 【网络编程】利用套接字实现一个简单的网络通信(UDP实现聊天室 附上源码)

    源IP地址(Source IP Address): 源IP地址是数据包发送方(或数据流出发点)的唯一标识符。它用于在互联网或本地网络中定位发送数据包的设备或主机。源IP地址是数据包的出发点,即数据从这个地址开始传送,向目的IP地址指示的设备发送。 在TCP/IP协议中,源IP地址通常由发

    2024年02月14日
    浏览(86)
  • 【网络编程】实现一个简单多线程版本TCP服务器(附源码)

    accept 函数是在服务器端用于接受客户端连接请求的函数,它在监听套接字上等待客户端的连接,并在有新的连接请求到来时创建一个新的套接字用于与该客户端通信。 下面是 accept 函数的详细介绍以及各个参数的意义: sockfd: 是服务器监听套接字的文件描述符,通常是使用

    2024年02月13日
    浏览(53)
  • Retrofit源码分析&实践(八)【Retrofit CallAdapter的引入】

    Retrofit源码分析实践系列文章目录 Retrofit源码分析实践(一)【从使用入手分析源码】 Retrofit源码分析实践(二)【Retrofit 免费的api测试工具引入】 Retrofit源码分析实践(三)【Retrofit 代码框架搭建】 Retrofit源码分析实践(四)【Retrofit 实现请求和返回】 Retrofit源码分析实践

    2024年02月02日
    浏览(78)
  • 【Android复习笔记】Retrofit核心原理

    1. 创建一个 interface 作为 Web Service 的请求集合,在里面用注解( Annotation )写入需要配置的请求方法

    2024年02月10日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包