type
status
date
slug
summary
tags
category
password
icon
Retrofit 使用方法简介
- 创建一个 interface 作为 Web Service 的请求集合,在里面用注解(Annotation)写入需要配置一个请求方法。
- 在正式代码⾥⽤ Retrofit 创建出 interface 的实例
- 调⽤创建出的 Service 实例的对应⽅法,创建出相应的可以⽤来发起⽹络请求的 Call 对象
- 使⽤
Call.execute()
或者 Call.enqueue() 来发起请求
Retrofit源码结构总结
核心:动态代理 代理:创建一个类去实现需要代理的接口(可能有多个),这些接口的的方法在调用时都会去调用这个类的一个对象,而这个类就被称为代理类,类的对象就是实际做事的。 动态代理:创建的类是在运行是生成的。
- 通过
Retrofit.create(Class)
⽅法创建出 Service interface 的实例,从⽽使得 Service 中配置的⽅法变得可⽤,这是 Retrofit 代码结构的核⼼
Retrofit.create()
⽅法内部,使⽤的是Proxy.newProxyInstance()
⽅法来创建Service 实例。这个⽅法会为参数中的多个 interface (具体到 Retrofit 来说,是固定传⼊⼀个 interface)创建⼀个对象,这个对象实现了所有 interface 的每个⽅法,并且每个⽅法的实现都是雷同的:调⽤对象实例内部的⼀个 InvocationHandler 成员变量的invoke()
⽅法,并把⾃⼰的⽅法信息传递进去。这样就在实质上实现了代理逻辑:interface 中的⽅法全部由⼀个另外设定的 InvocationHandler 对象来进⾏代理操作。并且,这些⽅法的具体实现是在运⾏时⽣成interface 实例时才确定的,⽽不是在编译时(虽然在编译时就已经可以通过代码逻辑推断出来)。这就是⽹上所说的「动态代理机制」的具体含义
- 因此,
invoke()
⽅法中的逻辑,就是 Retrofit 创建 Service 实例的关键。这个⽅法内有三⾏关键代码,共同组成了具体逻辑: - ServiceMethod 的创建:
- OkHttpCall 的创建:
- adapt() ⽅法:
这⾏代码负责读取 interface 中原⽅法的信息(包括返回值类型、⽅法注解、参数类型、参数注解),并将这些信息做初步分析。实际返回的是⼀个 CallAdapted 。
OkHttpCall
是 retrofit2.Call
的⼦类。这⾏代码负责将 ServiceMethod 解读到的信息(主要是⼀个 RequestFactory
、⼀个 OkHttpClient
和⼀个 ResponseConverter
)封装进 OkHttpCall
;⽽这个对象可以在需要的时候(例如它的 enqueue()
⽅法被调⽤的时候),利⽤RequestFactory
和 OkHttpClient
来创建⼀个 okhttp3.Call
对象,并调⽤这个 okhttp3.Call
对象来进⾏⽹络请求的发起,然后利⽤ ResponseConverter
对结果进⾏预处理之后,交回给 Retrofit 的 Callback
。这个⽅法会使⽤⼀个 CallAdapter 对象来把 OkHttpCall 对象进⾏转换,⽣成⼀个新的对象。默认情况下,返回的是⼀个
ExecutorCallbackCall
,它的作⽤是把操作切回主线程后再交给 Callback
。另外,如果有⾃定义的 CallAdapter,这⾥也可以⽣成别的类型的对象,例如 RxJava 的
Observable
,来让 Retrofit 可以和 RxJava 结合使⽤。- 作者:shuouyang
- 链接:https://notion-tree.vercel.app/article/4f4cc256-655d-4bde-9b88-841f0eb7930b
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章