一、实现原理
1. 通过Builder创建Retrofit对象
2. 在create方法中,通过动态代理的方式,生成实现类
3. 在调用接口方法时,会触发InvocationHandler的invoke方法,将接口的空方法转换成ServiceMethod
4. 然后生成okhttp请求
5. 通过callAdapterFactory找到对应的执行器,比如RxJava2CallAdapterFactory
6. 最后通过ConverterFactory将返回数据解析成JavaBena
使用者只需要关心请求参数,内部实现由retrofit封装完成,底层请求还是基于okhttp实现的
二、基本使用
三步走
1.创建 Retrofit 对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
2.定义 API
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
3.获取 API 实例
GitHubService github = retrofit.create(GitHubService.class);
从分析create。创建接口实例开始分析。看一下代码
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)
throws Throwable {
// If the method is a method from Object then defer to normal invocation.
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
if (platform.isDefaultMethod(method)) {
return platform.invokeDefaultMethod(method, service, proxy, args);
}
ServiceMethod serviceMethod = loadServiceMethod(method);
OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
}
);
这三行代码基本就是对应于流程图中轴上部了,ServiceMethod,OkHttpCall,CallAdapter adapter。 以下函数分析的比较清晰。可以参考。老生常谈之 Retrofit 面试看这一篇就够了_retrofit面试-CSDN博客