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()
组件 | 类型 | 作用 | 实现细节 |
---|---|---|---|
baseUrl | HttpUrl | API 根路径 | 与端点路径拼接:http://10.0.2.2/get_data.json |
ConverterFactory | 工厂类 | 数据格式转换 | GsonConverterFactory 处理 JSON↔POJO 转换 |
CallAdapterFactory | 工厂类 | 调用方式适配 | 默认使用 ExecutorCallAdapterFactory |
callFactory | OkHttpClient | 网络执行器 | 默认创建 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);});}});}
}
八、完整请求流程
九、设计亮点总结
-
动态代理解耦:
-
将接口声明与实际实现分离
-
运行时生成API实现类
-
-
注解驱动设计:
-
@GET
/@POST
定义请求方法 -
@Path
/@Query
处理参数 -
@Headers
配置请求头
-
-
组件化架构:
+---------------------+ | Interface | +----------+----------+| +----------v----------+ | ServiceMethod | | - 注解解析器 | | - 请求构建器 | +----------+----------+| +----------v----------+ | OkHttpCall | | - 网络执行器 | +----------+----------+| +----------v----------+ +-----------------+ | Converter <---- ConverterFactory | | - 数据转换引擎 | +-----------------+ +----------+----------+| +----------v----------+ +------------------+ | CallAdapter <---- CallAdapterFactory| | - 调用方式适配器 | +------------------+ +---------------------+
-
线程切换机制:
-
默认通过
MainThreadExecutor
实现主线程回调 -
可自定义线程调度策略
-
总结:
Retrofit 的核心原理分为三步:
第一步:接口声明
用 Java 接口 + 注解(如@GET
)定义 API 方法,描述请求方式和数据格式。第二步:动态代理
通过retrofit.create()
生成接口的动态代理对象。调用方法时,Retrofit 自动解析注解,构建网络请求。第三步:请求执行
构建请求:解析注解生成 HTTP 请求模板
执行请求:委托 OkHttp 发送网络请求
转换数据:通过 Converter(如 Gson)将响应数据转为 Java 对象
回调结果:通过 CallAdapter 将结果返回到主线程
Retrofit 的三大设计优势:
解耦架构:网络层(OkHttp)、数据转换(Converter)、业务逻辑完全分离
灵活扩展:支持自定义 Converter(如 XML/ProtoBuf)和 CallAdapter(如 RxJava)
高效安全:编译时校验注解,避免运行时错误
一句话总结Retrofit工作流程:
“Retrofit 通过动态代理技术,将接口声明转化为网络请求。当我们调用
retrofit.create()
时,它会生成接口的代理实例;执行接口方法时,自动解析@GET
等注解构建请求模板,委托 OkHttp 发送请求,再用 Gson 等 Converter 解析响应数据,最后通过 CallAdapter 将结果回调到主线程。这种设计实现了网络层与业务逻辑的彻底解耦。”