一定能看懂的 Retrofit 最详细的源码解析! - 简书
Retrofit原理分析_xiao_nian的博客-CSDN博客_retrofit原理
Retrofit 网络请求的工作本质上是 OkHttp
完成,而 Retrofit 仅负责 网络请求接口的封装.
- App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作
- 在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析
Retrofit内部大量使用了设计模式,比如构造Retrofit对象时使用了Builder模式,处理接口时是用来动态代理模式,适配OkHttpCall时使用了Adapter模式,生成CallAdpater和Converter时使用了工厂模式。Retrofit的设计正是因为遵循了面向对象的思想,以及对设计模式的正确应用,才使得其具备结构清晰、易于扩展的特点.
Retrofit的使用步骤:
1、创建Retrofit实例;
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://fanyi.youdao.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
Retrofit通过build模式来生成一个Retrofit对象,Retrofit默认会使用OkHttp来发送网络请求,当然,我们也可以自己定制。
2、创建网络请求接口和相关属性注解;
public interface NetService {
@GET("cozing")
Call<NetResponse> serviceApi();
}
3. 创建用于接收请求返回的数据接收:
public class NetResponse {
private int id;
private String name;
}
4、通过动态代理解析请求接口的注解,并生成网络请求对象;
NetService netApi = retrofit.create(NetService.class);
Call<NetResponse> call = netApi.serviceApi();
//① 同步请求
Response response = call.execute();
//②异步请求
call.enqueue(new Callback<NetResponse>() {
@Override
public void onResponse(Call<NetResponse> call, Response<NetResponse> response) {
}
@Override
public void onFailure(Call<NetResponse> call, Throwable t) {
}
});
Retrofit的create方法通过动态代理的模式,生成了实现了具体的网络请求接口的对象,并在InvocationHandler的invoke方法中统一处理网络请求接口实体对象的方法,invoke方法会通过方法构造一个ServiceMethod对象,并将其放入缓存中,然后根据ServiceMethod对象和网络请求的参数去构造一个OkHttpCall对象,最后调用serviceMethod的callAdapter的adapt方法,传入将OkHttpCall对象,callAdapter的目的主要是为了适配OkHttpCall对象,其内部会对OkHttpCall对象进行包装,生成对应返回类型的对象。
动态代理的原理主要是在运行时动态生成代理类,然后根据代理类生成一个代理对象,在这个代理对象的方法中又会调用InvocationHandler的invoke来转发对方法的处理.
代理类的代码是动态生成的,生成代码后我们就可以用ClassLoader将其加载到内存中,并通过反射生成代理对象,代理类会将方法的处理转发给InvokeHandler,所以所有对代理对象方法的调用都会由InvocationHandler的invoke方法处理。
5、通过网络请求适配器(
CallAdapter) 将网络请求对象进行平台适配,平台包括(Android/java8/iOS);
6、通过网络请求执行器(OkHttpCall) 发送网络请求;
7、通过Converter数据转换适配器解析返回的数据;
8、通过线程切换执行器切换到主线程(仅限异步请求)。