当前位置: 首页 > news >正文

Android Retrofit 解析

一、接口声明层

interface AppService {@GET("get_data.json")fun getAppData(): Call<List<App>>
}
  • @GET 注解:标记 HTTP 请求方法,生成请求模板

  • 路径参数"get_data.json" 是相对路径,与 baseUrl 拼接成完整 URL

  • 返回值类型Call<List<App>> 定义响应处理方式

  • 核心作用:通过 Java 接口描述 API 规范,形成声明式契约

二、Retrofit 构建层
val retrofit = Retrofit.Builder().baseUrl("http://10.0.2.2/")                 // 基础地址.addConverterFactory(GsonConverterFactory.create()) // 数据转换器.build()
组件类型作用实现细节
baseUrlHttpUrlAPI 根路径与端点路径拼接:http://10.0.2.2/get_data.json
ConverterFactory工厂类数据格式转换GsonConverterFactory 处理 JSON↔POJO 转换
CallAdapterFactory工厂类调用方式适配默认使用 ExecutorCallAdapterFactory
callFactoryOkHttpClient网络执行器默认创建 OkHttpClient 实例
三、动态代理层
val appService = retrofit.create(AppService::class.java)

内部机制:

public <T> T create(final Class<T> service) {// 1. 验证接口合法性(必须是接口,不能继承其他接口)validateServiceInterface(service);// 2. 创建动态代理return (T) Proxy.newProxyInstance(service.getClassLoader(),new Class<?>[] { service },new InvocationHandler() {private final Platform platform = Platform.get();@Override public Object invoke(Object proxy, Method method, Object[] args) {// 3. 解析方法注解ServiceMethod<Object, Object> serviceMethod = (ServiceMethod<Object, Object>) loadServiceMethod(method);// 4. 创建OkHttpCall实例OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);// 5. 适配返回值类型return serviceMethod.callAdapter.adapt(okHttpCall);}});
}
四、ServiceMethod
ServiceMethod<?, ?> loadServiceMethod(Method method) {// 1. 缓存检查(避免重复解析)ServiceMethod<?, ?> result = serviceMethodCache.get(method);if (result != null) return result;// 2. 同步解析synchronized (serviceMethodCache) {// 3. 创建RequestFactory解析注解RequestFactory requestFactory = RequestFactory.parseAnnotations(retrofit, method);// 4. 获取返回类型适配器Type returnType = method.getGenericReturnType();CallAdapter<?, ?> callAdapter = createCallAdapter(returnType);// 5. 获取数据转换器Converter<ResponseBody, ?> responseConverter = createResponseConverter(method);// 6. 构建ServiceMethodresult = new ServiceMethod.Builder(retrofit, method, requestFactory, callAdapter, responseConverter).build();// 7. 加入缓存serviceMethodCache.put(method, result);return result;}
}

组件协作:

五、OkHttpCall:网络请求执行器
final class OkHttpCall<T> implements Call<T> {private final RequestFactory requestFactory;private final Object[] args;private final CallAdapter<T, ?> callAdapter;public Response<T> execute() {// 1. 构建OkHttp请求okhttp3.Call call = createRawCall();// 2. 同步执行请求Response<ResponseBody> rawResponse = parseResponse(call.execute());// 3. 转换响应数据T body = responseConverter.convert(rawResponse.body());return Response.success(body, rawResponse);}public void enqueue(Callback<T> callback) {// 异步执行(原理类似)}
}
六、Converter:数据转换引擎
// GsonConverterFactory 实现
final class GsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {private final Gson gson;private final TypeAdapter<T> adapter;@Override public T convert(ResponseBody value) throws IOException {JsonReader jsonReader = gson.newJsonReader(value.charStream());try {return adapter.read(jsonReader); // JSON→POJO转换} finally {value.close();}}
}

转换过程:

HTTP响应(JSON) 
→ ResponseBody (原始字节流) 
→ JsonReader (字符流) 
→ Gson解析 
→ List<App> (Java对象)
七、CallAdapter:调用方式适配器
// 默认CallAdapter实现
final class DefaultCallAdapterFactory extends CallAdapter.Factory {@Overridepublic CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {// 1. 验证返回类型是否为Call<?>if (getRawType(returnType) != Call.class) return null;// 2. 创建适配器实例return new CallAdapter<Object, Call<?>>() {@Override public Call<Object> adapt(Call<Object> call) {return new ExecutorCallbackCall<>(callbackExecutor, call);}};}
}// 实际执行调用的包装类
static final class ExecutorCallbackCall<T> implements Call<T> {@Overridepublic void enqueue(final Callback<T> callback) {// 将回调切换到主线程delegate.enqueue(new Callback<T>() {@Override public void onResponse(Call<T> call, final Response<T> response) {callbackExecutor.execute(() -> {callback.onResponse(ExecutorCallbackCall.this, response);});}});}
}
八、完整请求流程

九、设计亮点总结
  1. 动态代理解耦

    • 将接口声明与实际实现分离

    • 运行时生成API实现类

  2. 注解驱动设计

    • @GET/@POST 定义请求方法

    • @Path/@Query 处理参数

    • @Headers 配置请求头

  3. 组件化架构

    +---------------------+
    |      Interface      |
    +----------+----------+|
    +----------v----------+
    |   ServiceMethod     |
    |   - 注解解析器       |
    |   - 请求构建器       |
    +----------+----------+|
    +----------v----------+
    |     OkHttpCall      |
    |   - 网络执行器       |
    +----------+----------+|
    +----------v----------+    +-----------------+
    |      Converter       <---- ConverterFactory |
    |   - 数据转换引擎      |    +-----------------+
    +----------+----------+|
    +----------v----------+    +------------------+
    |    CallAdapter       <---- CallAdapterFactory|
    |   - 调用方式适配器    |    +------------------+
    +---------------------+
  4. 线程切换机制

    • 默认通过MainThreadExecutor实现主线程回调

    • 可自定义线程调度策略

总结

Retrofit 的核心原理分为三步:
第一步:接口声明
用 Java 接口 + 注解(如 @GET)定义 API 方法,描述请求方式和数据格式。

第二步:动态代理
通过 retrofit.create() 生成接口的动态代理对象。调用方法时,Retrofit 自动解析注解,构建网络请求。

第三步:请求执行

  1. 构建请求:解析注解生成 HTTP 请求模板

  2. 执行请求:委托 OkHttp 发送网络请求

  3. 转换数据:通过 Converter(如 Gson)将响应数据转为 Java 对象

  4. 回调结果:通过 CallAdapter 将结果返回到主线程


Retrofit 的三大设计优势:

  1. 解耦架构:网络层(OkHttp)、数据转换(Converter)、业务逻辑完全分离

  2. 灵活扩展:支持自定义 Converter(如 XML/ProtoBuf)和 CallAdapter(如 RxJava)

  3. 高效安全:编译时校验注解,避免运行时错误


一句话总结Retrofit工作流程:

“Retrofit 通过动态代理技术,将接口声明转化为网络请求。当我们调用 retrofit.create() 时,它会生成接口的代理实例;执行接口方法时,自动解析 @GET 等注解构建请求模板,委托 OkHttp 发送请求,再用 Gson 等 Converter 解析响应数据,最后通过 CallAdapter 将结果回调到主线程。这种设计实现了网络层与业务逻辑的彻底解耦。”

相关文章:

  • 数学建模会议笔记
  • FFmpeg常见命令以及解析
  • 什么真正的云原生开发?如何区别本地开发后部署到云端?
  • vb逆向常用函数
  • 配置外设参数与时钟频率 (PCLK1, PCLK2) 的关系
  • 图书整理--LeetCode
  • Linux操作系统之进程(六):进程的控制(上)
  • 01初始uni-app+tabBar+首页
  • 第八节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 用户管理(下)
  • 【redis】安装与使用
  • Unity 在Scroll View内连续截图并保存本地(把滚动列表内的内容截成一个长图)
  • 自然语言处理【NLP】—— CBOW模型
  • JavaEE->多线程1
  • Vue + Spring Boot 前后端交互实践:正确使用 `Content-Type: application/json` 及参数传递方式
  • SonarQube 25.6 完整指南:部署、使用与 CI/CD 集成
  • 【深度学习】TensorFlow全面指南:从核心概念到工业级应用
  • FPGA基础 -- Verilog语言要素之变量类型
  • JavaSE - Object 类详细讲解
  • C/C++中的位域(Bit-field)是什么?
  • 自然语言处理(NLP)核心技术:从词嵌入到Transformer
  • 网站建设平台怎么做/百度关键词搜索排名多少钱
  • 高端品质网站建设/小程序制作
  • 帮别人做设计图的网站/今日国际军事新闻
  • 麟游住房和城市建设局网站/百度收录查询api
  • 政府网站维护方案/百度搜索排行榜
  • 如何评价一个网站做的是否好/工业设计公司