Retrofit 原理篇
1、Retrofit 实现原理
Retrofit 通过 java 接口以及注解来描述网络请求,并用动态代理的方式生成网络请求的 request,然后通过 client 调用相应的网络框架(默认 okhttp)去发起网络请求,并将返回的 response 通过 converterFactorty 转换成相应的数据 model,最后通过 calladapter 转换成其他数据方式(如 rxjava Observable)
通过 Retrofit. create( ciass)方法创建出 Service interface 的实例,从而使得 Service 中配置的方法变得可用,这是 Retrofit 代码结构的核心;
Retrofit.create()方法内部,使用的是 Proxy.newProxylnstancef)方法来创建Service 实例。这个方法会为参数中的多个 interface (具体到 Retrofit 来说,是固定传入一个interface)创建一个对象,这个对象实现了所有 interface 的每个方法,并且每个方法的实现都是雷同的:调用对象实例内部的一个工 invocationHandler 成员变量的 invoke()方法,并把自己的方法信息传递进去。这样就在实质上实现了代理逻辑:interface 中的方法全部由一个另外设定的 InvocatioriHandler 对象来进行代理操作。并且,这些方法的具体实现是在运行时生成 interface 实例时才确定的,而不是在编译时(虽然在编译时就已经可以通过代码逻辑推断出来)。这就是网上所说的「动态代理机制」的具体含义。
使用
@GET("/user/{user}/repos")Call<List<Repo>> listRepos(@Path("user") String user);//call封装了整个okhttp的请求Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverteractory.create())//.addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();//converterFactory//后续交个okhttp
2、动态代理和静态代理的区别?
静态代理类由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
动态代理类是在程序运行期间由 JVM 根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。
静态代理
静态代理业务类只需要关注业务逻辑本身,保证了业务类的重用性。代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,需要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法,增加了代码维护的复杂度。
动态代理
动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler invoke)。这样,在接口方法数量比较多的时候,可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使类职责更加单一,复用性更强。
3.使用Retrofit的七步骤
- 添加Retrofit依赖,网络权限
- 定义接收服务器返回数据的Bean
- 创建网络请求的接口,使用注解(动态代理,核心)
- builder模式创建Retrofit实例,converter,calladapter...
- 创建接口实例,调用具体的网络请求
- call同步/异步网络请求
- 处理服务器返回的数据。
4、Retrofit 流程
- 通过解析网络请求接口的注解,配置网络请求参数
- 通过动态代理生成网络请求对象
- 通过网络请求适配器将网络请求对象进行平台适配
- 通过网络请求执行器发送网络请求
- 通过数据转换器解析服务器返回的数据
- 通过回调执行器切换线程(子线程 ->>主线程)
- 用户在主线程处理返回结果
5、Retrofit 优点
- 可以配置不同 HTTP client 来实现网络请求,如 okhttp、httpclient 等;
- 请求的方法参数注解都可以定制;
- 支持同步、异步和 RxJava;
- 超级解耦;
- 可以配置不同的反序列化工具来解析数据,如 json、xml 等
- 框架使用了很多设计模式
6、Retrofit 中的数据究竟是怎么处理的?它是怎么返回RxJava.Observable 的?
Retrofit 中的数据其实是交给了 callAdapter 以及 converter 去处理,callAdapter 负责把 okHttpCall 转成我们所需的 Observable 类型, converter 负责把服务器返回的数据转成具体的实体类。
————————————————
版权声明:本文为CSDN博主「Jaynm」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jaynm/article/details/108614788
Retrofit 原理篇相关推荐
- 《CDN 之我见》系列二:原理篇(缓存、安全)
2019独角兽企业重金招聘Python工程师标准>>> <CDN之我见>共由三个篇章组成,分为原理篇.详解篇和陨坑篇.本篇章适合那些从未接触过.或仅了解一些 CDN 专业 ...
- 检查压缩包是否损坏_修复损坏的gzip压缩文件之原理篇
接修复损坏的gzip压缩文件之原理篇,再次引用GZIP结构图: 已知修复一个损坏的gzip文件的关键环节在于找到下一个正常压缩包的起始点.根据结构图中的信息可知,每个压缩包的开始结构中有是否到达尾部标 ...
- Tomcat 原理篇
TOMCAT 原理篇 一.Tomcat 组成(Tomcat 由以下组件组成) 1.server a) Server是一个Catalina Servlet容器: b) Server 可以包含一个或多个s ...
- Retrofit 原理解析
Retrofit 是什么? * Retrofit adapts a Java interface to HTTP calls by using annotations on the declared ...
- Retrofit原理分析
Retrofit原理分析 温故而知新 还记得retrofit的使用方法嘛,下面我们来回顾一下 接口定义 public interface GitHubService {@GET("users ...
- React Native JSBundle拆包之原理篇
概述 RN作为一款非常优秀的移动端跨平台开发框架,在近几年得到众多开发者的认可.纵观现在接入RN的大厂,如qq音乐.菜鸟.去哪儿,无疑不是将RN作为重点技术栈进行研发. 不过,熟悉RN的开发者也知道, ...
- 通过“四大行为”对WCF的扩展[原理篇]
整个WCF框架由两个基本的层次构成,即服务模型层和信道层.对信道层的扩展主要通过针对绑定的扩展实现,具体来说就是自定义绑定元素,以及相关的信道管理器(信道监听器和信道工厂).信道来改变对消息的处理和传 ...
- 《CDN 之我见》原理篇——CDN的由来与调度
2019独角兽企业重金招聘Python工程师标准>>> CDN是将源站内容分发至全国所有的节点,从而缩短用户查看对象的延迟,提高用户访问网站的响应速度与网站的可用性的技术.它能够有效 ...
- 原理篇 | 推荐系统之矩阵分解模型
导语:本系列文章一共有三篇,分别是 <科普篇 | 推荐系统之矩阵分解模型> <原理篇 | 推荐系统之矩阵分解模型> <实践篇 | 推荐系统之矩阵分解模型> 第一篇用 ...
最新文章
- 使用Python+OpenCV+GAN实现车牌图像增强
- 2013-07-22 IT 要闻速记快想
- 宽带651以及光猫红色灯闪烁-故障维修
- CVPR2021 用更好的目标检测器提取视觉特征!微软提出VinVL,基于更好的视觉特征,达到更强的多模态性能...
- (需要大神,请求解决,遇见runtime error 错误)poj 1009 java
- C++_类和对象_对象特性_空指针访问成员函数_用法和问题解决---C++语言工作笔记050
- 嵌入式linux gif 缩放_嵌入式环境动力监控主机
- 征集大家的网站如何防范DDOS攻击解决方案
- Flutter 基础Widgets之容器Container详解
- 《圈圈教你玩USB》 第七章 USB MIDI键盘 看书笔记
- 电商项目java经验_分布式电商系统项目总结
- linux shell脚本开发工具,技术|10个工具让你的 shell 脚本更强大
- cwm oracle,oracle info
- 备战数学建模22-数学建模论文写作规范总结
- 建议IPC采用RTMP(server+rtmppush)的流媒体框架。
- linux红帽子怎么配置dhcp,红帽7 配置dhcp服务器
- 图片转ascii字符画C语言,将图片转为ASCII字符画
- vmware全屏后退出全屏快捷键
- 星环科技数据中台解决方案,助力某政府机构建设新型智慧城市
- 如何基于任务的价值确定其优先级