前言:Retrofit是一个非常流行的Android网络请求框架,主要用于简化HTTP请求的编写和执行。
一、使用简介
1.1 Retrofit的工作原理:
定义一个接口,并使用注解指定HTTP请求的方法、URL、参数等。通过动态代理模式,在运行时生成接口的实现类,该实现类负责发起网络请求。通过OkHttp客户端发送HTTP请求,处理响应,并通过Converter将响应数据转换为对象。支持同步和异步回调,通过CallbackAdapterFactory处理回调逻辑。
1.2 Retrofit使用步骤:
- 添加依赖: 在项目的build.gradle文件中添加Retrofit的依赖。
- 定义接口:创建一个接口,使用注解定义HTTP请求的方法和参数。
- 创建Retrofit实例:通过Retrofit.Builder配置baseUrl、添加转换器等,然后创建Retrofit实例。
- 创建接口实例:通过Retrofit实例创建接口的动态代理实例。
- 发送请求:调用接口实例的方法发送请求,处理响应。
1.3 代码示例:
// 定义接口
public interface ApiService {
@GET("/users/{username}")
Call<User> getUser(@Path("username") String username);
}
// 创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
.client(new OkHttpClient())
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())//设置数据解析器
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 添加RxJava适配器
.build();
ApiService service = retrofit.create(ApiService.class);
// 发送请求
Call<User> userCall = service.getUser("test");
userCall.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
// 处理响应数据
}
@Override
public void onFailure(Call<User> call, Throwable t) {
// 处理错误情况
}
});
二、流程分析
3.1 流程图
3.2 流程讲解
1. 创建Retrofit实例;
2. 创建网络请求接口和相关属性注解;
3. 通过动态代理解析请求接口的注解,并生成网络请求对象;
4. 通过CallAdapter进行平台适配,平台包括(Android/java8/iOS);
5. 通过OkHttpCall发送网络请求;
6. 通过Converter数据转换适配器转换交易返回的数据;
7. 通过线程切换执行器切换到主线程;
三、源码分析
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://github.com")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
3.1、Retrofit类内部的成员变量
public final class Retrofit {
private final Map<Method, ServiceMethod<?, ?>> serviceMethodCache = new ConcurrentHashMap<>(); //网络请求缓存,如:请求方法、请求头、请求体,各种适配器等
final okhttp3.Call.Factory callFactory; //okhttp工厂,真正发送交易的处理类
final HttpUrl baseUrl; //请求url前半部,基地址
final List<Converter.Factory> converterFactories; //数据转换器工厂集
final List<CallAdapter.Factory> adapterFactories; //网络请求适配器工厂集
final @Nullable Executor callbackExecutor; //异步请求结果线程切换执行器
final boolean validateEagerly; //标志位、是否马上解析接口方法
...
}
3.2、Retrofit内部类Builder
public final class Retrofit {
...
public static final class Builder {
private final Platform platform; //适配平台,通常默认android
private @Nullable okhttp3.Call.Factory callFactory; //okhttp网络请求工厂,默认okhttp
private HttpUrl baseUrl; //基地址
private final List<Converter.Factory> converterFactories = new ArrayList<>(); //数据转换器集,用于生产数据转换器,默认GsonConverterFactory
private final L