Retrofit基本结构

Retrofit基本问题

1.retrofit的基本实现原理是什么?

retrofit是基于okhttp框架封装的一套易用的网络框架,通过注解+动态代理的方式代理创建Call对象,然后把请求和处理的过程交给CallAdapter接口,这样节省了创建call代码。同时请求的发起和处理都由CallAdapter和ConvertAdapter来处理。

2.CallAdapter和Convert接口的作用是什么?

Convert接口在使用的时候主要是用来进行request处理,response处理,比如GsonConverterFactory中的请求和响应处理。另外他还负责了解析一部分接口参数的处理作用,比如ParameterHander中解析注解参数的时候用到,用来帮助构建request。

public interface Converter<F, T> {
  @Nullable T convert(F value) throws IOException;
}

CallAdapter接口主要是返回代理对象。

public interface CallAdapter<R, T> {

  Type responseType();

  T adapt(Call<R> call);
}

这里Call是实际的网络请求层,它就是Okhttp3.Call,已经能够直接执行call.execute() 返回请求结果了,但是这里增加一个Adapt就能够再把请求结果直接转化成目标T类型。具体可以看CallAdapter工厂生成的CallAdapter,RxJava2CallAdapter生成了一个基于Observable<?> observable。默认的DefaultCallAdapterFactory中Adapter是生成了一个ExecutorCallbackCall<T> 对象。

3.接口的代理过程是怎么样的?

根据Retrofit参数、接口参数、注解生成代理类MethodService,在生成MethodService的过程中解析注解,接口参数然后生成Request和OkHttpCall(OkHttpCall中会生成Okhttp3.Call)。代理的准备过程就是生成Request,进而生成OkHttpCall,因为有了这个Call就具备网络请求的条件。代理的执行过程 代理对象调用接口时,会通过InvocationHandler会把请求转发给MethodService.invoke()。然后MethodService调用allAdapter.adapt(Call)来处理。其实网络请求是通过Call.execute()或者Call.equeue(CallBack<T> call)方法开启的,其他的各种花式操作,不过是在此方法之前对参数处理或者在请求完之后有对结果进行处理。通过自定CallAdapter,ConverAdapter接口可以完成各种花式操作,最后返回目标结果。DefaultCallAdapterFactory和RxJava2CallAdapterFactory提供的CallAdapter是此类花式操作的典范。

4.类的关系图。

代理的关系图

代理过程主要是生成Call,默认是生成OkhttpCall,它是Okhttp3.Call的一个包装类,生成call之后,就要交给CallAdapter来返回T。

每一个接口方法都会生成一个ServiceMethod。ServiceMethod中包含网络请求的所有数据。

其中parasAnnotations()方法完成了request都构建,OkHttpCall的构建。代理调用时会通过InvocationHandler把请求转发给ServiceMethod.invoke()处理,生成Calll, 最后都是交给CallAdapter.adapt(Call<T> call)来返回T。

OkHttpCall的生成关系

注解解析相关的类

解析参数的时候用到了Convert及其子类

设计模式

我觉得rxjava最明显的使用了代理模式、适配器,工厂模式等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值