Retrofit源码分析

基本流程: 1.通过ServiceMethod获取请求参数和请求信息 2.创建OkhttpCall 3.获取对应的CallAdapter,然后调用adapt方法并将OkhttpCall传入。 4.在CallAdapter的adapt方法中执行OkhttpCall的execute方法,并调用ServiceMethod中的ConvertAdapter将返回结果转换为相应的实体。

ServiceMethod

ServiceMethod主要用来解析我们声明的方法。 1.Builder构造函数中获取方法上的注解和注解里的值。 2.调用createCallAdapter方法获取CallAdapter。 3.调用createResponseConverter方法获取Converter。 4.调用parseMethodAnnotation来解析方法上的注解 5.调用parseParameterAnnotation来解析参数上的注解,并将这些注解包含的信息封装成一个ParameterHandler对象。 6.在OkHttpCall中调用toRequest的方法来获取请求的参数。

public Builder(Retrofit retrofit, Method method) {
  this.retrofit = retrofit;
  this.method = method;
  this.methodAnnotations = method.getAnnotations();//获取方法上的注解
  this.parameterTypes = method.getGenericParameterTypes();//获取参数类型
  this.parameterAnnotationsArray = method.getParameterAnnotations();//获取参数上的注解  这里是一个二维数组,每个参数可能有多个注解
}

createCallAdapter方法获取方法的返回值和注解,根据注解和返回值获取对应的CallAdapter。

private CallAdapter<T, R> createCallAdapter() {
  Type returnType = method.getGenericReturnType();//获取返回值
  //校验返回值类型
  if (Utils.hasUnresolvableType(returnType)) {
    throw methodError(
        "Method return type must not include a type variable or wildcard: %s", returnType);
  }
  if (returnType == void.class) {
    throw methodError("Service methods cannot return void.");
  }
  Annotation[] annotations = method.getAnnotations();
  try {
    //noinspection unchecked
    //调用Retrofit的 callAdapter方法来获取CallAdapter
    return (CallAdapter<T, R>) retrofit.callAdapter(returnType, annotations);
  } catch (RuntimeException e) { // Wide exception range because factories are user code.
    throw methodError(e, "Unable to create call adapter for %s", returnType);
  }
}

Retrofit的callAdapter方法

ParameterHandler最主要的方法就是apply方法,该方法的作用是为build添加参数。

ServiceMethod的toRequest先创建一个RequestBuilder,然后遍历参数,依次向build中添加参数。

RequestBuilder用来构建请求的Request。

OkHttpCall

OkHttpCall算是OkHttp的包装类,用它跟OkHttp对接,所有OkHttp需要的参数都可以看这个类。当然也还是可以扩展一个新的Call的,比如HttpUrlConnectionCall。

CallAdapter

RxJavaCallAdapterFactory

Single类和Observable对象类似,只不过Single只能发送单个值,并且Single只能发出一个错误或成功的值,不能发送onComplete通知。

Single的just方法。

Completable也和Observable类似,但是Completable不发送值,值发送错误和完成。

当我们的请求不需要处理返回值的时候我们可以让该请求返回Completable。

RxJavaCallAdapter的adapt方法

CallOnSubscribe

BodyOnSubscribe

ResultOnSubscribe

最后更新于