Android-Retrofit源码解析

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);
  1. create() 方法的动态代理机制
    调用 retrofit.create(Service::class.java) 时,通过 Proxy.newProxyInstance 创建接口的代理对象。
    • 当调用接口方法时,触发 InvocationHandlerinvoke() 方法。
  2. 解析接口方法生成 ServiceMethod
    • RequestFactory:解析方法注解(如 @GET@POST)及参数(如 @Query),生成 HTTP 请求模板,处理注解合并成请求参数类parameterHandler。
    • CallAdapter:根据方法返回类型(如 Call<T>Observable<T>)选择适配器,将 HTTP 调用转换为特定类型。
    • ConvertAdapter:数据解析转换器

三、网络请求执行流程

//获取的是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) {
        // 处理网络错误
    }
});
  1. OkHttpCall 封装请求
    Retrofit 将请求封装为 OkHttpRealCall,内部委托给 OkHttpClient 执行实际网络操作。
  2. 责任链处理响应
    • Converter:将 ResponseBody 转换为目标类型(如 JSON → Java 对象),通过 GsonConverterFactory 实现。
    • 线程切换:Android 平台通过 MainThreadExecutor 确保回调在主线程执行。

四、关键设计模式与扩展性

类名 职责 关联设计模式
Retrofit 全局配置与 API 实例生成 建造者模式、动态代理
ServiceMethod 解析接口方法生成请求模板 工厂模式
OkHttpCall 封装 OkHttp 请求与响应处理 委托模式
CallAdapter 适配不同返回值类型(如 RxJava) 适配器模式
Converter 数据格式转换(如 JSON → 对象) 责任链模式
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容