征服面试官: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
的每个方法,并且每个方法的实现都
是雷同的:调用对象实例内部的一个工nvocationHandler
成员变量的invoke()
方法,并
把自己的方法信息传递进去。这样就在实质上实现了代理逻辑:interface
中的方法全部由一个
另外设定的InvocatioriHandler
对象来进行代理操作。并且,这些方法的具体实现是在运行
时生成interface
实例时才确定的,而不是在编译时(虽然在编译时就已经可以通过代码逻辑推
断出来)。这就是网上所说的「动态代理机制」的具体含义。
2、动态代理和静态代理的区别?
-
静态代理类由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
-
动态代理类是在程序运行期间由 JVM 根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。
静态代理
静态代理业务类只需要关注业务逻辑本身,保证了业务类的重用性。代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,需要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法,增加了代码维护的复杂度。
动态代理
动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler invoke)。这样,在接口方法数量比较多的时候,可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使类职责更加单一,复用性更强。
3、Retrofit 流程
- 通过解析网络请求接口的注解,配置网络请求参数
- 通过动态代理生成网络请求对象
- 通过网络请求适配器将网络请求对象进行平台适配
- 通过网络请求执行器发送网络请求
- 通过数据转换器解析服务器返回的数据
- 通过回调执行器切换线程(子线程 ->>主线程)
- 用户在主线程处理返回结果
4、Retrofit 优点
- 可以配置不同 HTTP client 来实现网络请求,如 okhttp、httpclient 等;
- 请求的方法参数注解都可以定制;
- 支持同步、异步和 RxJava;
- 超级解耦;
- 可以配置不同的反序列化工具来解析数据,如 json、xml 等
- 框架使用了很多设计模式
5、Retrofit 中的数据究竟是怎么处理的?它是怎么返回 RxJava.Observable 的?
Retrofit
中的数据其实是交给了 callAdapter
以及 converter
去处理,callAdapter
负责把 okHttpCall
转成我们所需的 Observable
类型, converter
负责把服务器返回的数据转成具体的实体类。
上一篇: Spring Security专栏(关于如何实现 CSRF 保护)
下一篇: 演讲稿:项羽