a.png
一、Retrofit 的初始化与核心组件
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com/") // 基础 URL
.client(new OkHttpClient.Builder().build()) // 自定义 OkHttp 客户端(可选)
.addConverterFactory(GsonConverterFactory.create()) // JSON 转换器
.build();
Retrofit 通过 Builder
类完成初始化,核心配置包括:
-
baseUrl
(基础 URL) -
callFactory
(默认使用OkHttpClient
) - converterFactories(数据转换器工厂,将stream流转换为对应数据,如
Gson
解析,如果不设置的话默认返回Okhttp
中的ResponseBody对象) -
callAdapterFactories
(返回值适配器工厂,持有ExecutorCallBackCall对象支持线程切换(持有MainHandler
进行主线程切换),可替换为RxjavaAdapterFactory
支持observer
)
二、动态代理生成 API 接口实例
ApiService service = retrofit.create(ApiService.class);
-
create()
方法的动态代理机制
调用retrofit.create(Service::class.java)
时,通过Proxy.newProxyInstance
创建接口的代理对象。- 当调用接口方法时,触发
InvocationHandler
的invoke()
方法。
- 当调用接口方法时,触发
-
解析接口方法生成 ServiceMethod
-
RequestFactory:解析方法注解(如
@GET
、@POST
)及参数(如@Query
),生成 HTTP 请求模板,处理注解合并成请求参数类parameterHandler。 -
CallAdapter:根据方法返回类型(如
Call<T>
、Observable<T>
)选择适配器,将 HTTP 调用转换为特定类型。 - ConvertAdapter:数据解析转换器
-
RequestFactory:解析方法注解(如
三、网络请求执行流程
//获取的是Retrofit内的Call
Call<User> call = service.getUser("JohnDoe");
//代理执行ServiceMethord.callAdapter.adapt
//封装内部执行OkhttpRealCall中的实际网络操作,再由ExcutorCallBack执行切换线程操作
//执行toResponse方法将ResponseBody装换为对应Bean类,比如由GsonConverterFactory转换解析
call.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
if (response.isSuccessful()) {
User user = response.body();
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
// 处理网络错误
}
});
-
OkHttpCall 封装请求
Retrofit 将请求封装为OkHttpRealCall
,内部委托给OkHttpClient
执行实际网络操作。 -
责任链处理响应
-
Converter:将
ResponseBody
转换为目标类型(如 JSON → Java 对象),通过GsonConverterFactory
实现。 -
线程切换:Android 平台通过
MainThreadExecutor
确保回调在主线程执行。
-
Converter:将
四、关键设计模式与扩展性
类名 | 职责 | 关联设计模式 |
---|---|---|
Retrofit |
全局配置与 API 实例生成 | 建造者模式、动态代理 |
ServiceMethod |
解析接口方法生成请求模板 | 工厂模式 |
OkHttpCall |
封装 OkHttp 请求与响应处理 | 委托模式 |
CallAdapter |
适配不同返回值类型(如 RxJava) | 适配器模式 |
Converter |
数据格式转换(如 JSON → 对象) | 责任链模式 |