源码解析:Retrofit

302 阅读1分钟

Retrofit: 设计模式

image.png

适配器模式就是,已经存在的OkHttpCall,要被不同的标准,平台来调用。设计了一个接口CallAdapter,让其他平台都是做不同的实现来转换,这样不花很大的代价就能再兼容一个平台

public <T> T create(final Class<T> service) {

  Utils.validateServiceInterface(service);

  if (validateEagerly) {

    eagerlyValidateMethods(service);

  }

  return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },

      new InvocationHandler() {

        private final Platform platform = Platform.get();

        private final Object[] emptyArgs = new Object[0];

        @Override public @Nullable Object invoke(Object proxy, Method method,

            @Nullable 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);

          }

          return loadServiceMethod(method).invoke(args != null ? args : emptyArgs);

        }

      });
}

1,retrofit.create(ApiService.class)采用动态代理模式,即动态实现ApiService接口,动态接收接口中方法

2,获取接口中方法,注解,返回值

3,调用CallAdapterFactory.get(),ConverterFactory.responseBodyConverter(),即执行RxJava2CallAdapterFactory

,ResponseConverterFactory中get和responseBodyConverter

4,得到callAdapter,responseConverter,创建ServiceMethod(CallAdapted)

5,调用ServiceMethod.invoke,即HttpServiceMethod.invoke

6,invoke中创建OkhttpCall,call实现类,执行okhttp请求,parseResponse,调用到ResponseConverterFactory中convert

@Override final @Nullable ReturnT invoke(Object[] args) {

  Call<ResponseT> call = new OkHttpCall<>(requestFactory, args, callFactory, responseConverter);

  return adapt(call, args);

}

6,调用callAdapter.adapter,实现为RxJava2CallAdapter,返回对应Observer或者Call


static final class CallAdapted<ResponseT, ReturnT> extends HttpServiceMethod<ResponseT, ReturnT> {

  private final CallAdapter<ResponseT, ReturnT> callAdapter;

  CallAdapted(RequestFactory requestFactory, okhttp3.Call.Factory callFactory,

      Converter<ResponseBody, ResponseT> responseConverter,

      CallAdapter<ResponseT, ReturnT> callAdapter) {

    super(requestFactory, callFactory, responseConverter);

    this.callAdapter = callAdapter;

  }

  @Override protected ReturnT adapt(Call<ResponseT> call, Object[] args) {

    return callAdapter.adapt(call);
    
  }
}

retrofit.png