划水:Retrofit三步走:request篇

​ 在流程梳理篇,我们介绍了ServiceMethod是其retrofit的核心部分,这篇我们就着重分析retrofit的ServiceMethod这个处理类

build建造者部分

对于ServiceMethod这部分的build,其构造如下:

Builder(Retrofit retrofit, Method method) {
   
      this.retrofit = retrofit;
      this.method = method;
      this.methodAnnotations = method.getAnnotations();
      this.parameterTypes = method.getGenericParameterTypes();
      this.parameterAnnotationsArray = method.getParameterAnnotations();
    }

这里传入了retrofit本身和目标的方法method
 
从method的getAnnotations/getGenericParameterTypes/getParameterAnnotations
这些方法中,可以看出retrofit这部分就是想方设法从method上获取到所有的信息

从上面的构造入手,一下子就想到在使用的时候我们的一些做法,举例:

@FormUrlEncoded
    @POST("openapi.do")
    public abstract Call<TranslateBean> hello(@Field("keyfrom") String keyfrom,
                                              @Field("key") String key);

众所周知,一个request的组成基本上参数部分都是key-vale形式组成,那就不难理解为什么retrofit要求我们从通过方法注解/参数注解这些方式传入对应的关系了

理解了参数部分,我们看看build建造者最关键的方法build方法:

build方法较多,我们先折叠起来,看前半部分:

public ServiceMethod build() {
   
    callAdapter = createCallAdapter();
    responseType = callAdapter.responseType();
    responseConverter = createResponseConverter();
      ...省略部分代码
    return new ServiceMethod<>(this);
}

build方法上首先创建了一个callAdapter,提起callAdapter不免立马想到我们使用时传入的RxJavaCallAdapterFactory部分,我们顺着createCallAdapter看看跟我们RxJavaCallAdapterFactory有没有关系,

private CallAdapter<T, R> createCallAdapter() {
   
  		/**
  		 * 首先通过method获取返回值类型,紧跟着对返回值类型合法性验证
  		 */
      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.");
      }
  		/**
  		 * 接着获取方法上的注解,根据返回值类型和方法上的注解,调用retrofit的callAdapter
  		 */
      Annotation[] annotations = method.getAnnotations();
      try {
   
        //noinspection unchecked
        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方法其上注解是这样描述的:

 /**
   * Returns the
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值