6. Retrofit源码分析

一定能看懂的 Retrofit 最详细的源码解析! - 简书

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();

//②异步请求

  1.         call.enqueue(new Callback<NetResponse>() {

  2.             @Override

  3.             public void onResponse(Call<NetResponse> call, Response<NetResponse> response) {

  4.             }

  5.             @Override

  6.             public void onFailure(Call<NetResponse> call, Throwable t) {

  7.             }

  8.         });

 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、通过线程切换执行器切换到主线程(仅限异步请求)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值