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.类的关系图。

代理的关系图

Android Retrofit2实践 retrofit adapter_Android Retrofit2实践

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

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

Android Retrofit2实践 retrofit adapter_子类_02

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

OkHttpCall的生成关系

Android Retrofit2实践 retrofit adapter_子类_03

注解解析相关的类

Android Retrofit2实践 retrofit adapter_请求转发_04

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

Android Retrofit2实践 retrofit adapter_子类_05

设计模式

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