Retrofit源码分析之Request生成

这里主要运用到了注解和反射的知识,下面贴出来关键代码以及注释。

关键代码:

  1. 创建RequestFactory
static RequestFactory parseAnnotations(Retrofit retrofit, Method method) {
    return new Builder(retrofit, method).build();
 }
  1. build()方法初始化
RequestFactory build() {
	  //处理解析方法(GET、POST...)
      for (Annotation annotation : methodAnnotations) {
        parseMethodAnnotation(annotation);
      }
      ...
      //获取参数个数
      int parameterCount = parameterAnnotationsArray.length;
      //生成参数处理器(根据注解,这一步获取了参数类型)
      parameterHandlers = new ParameterHandler<?>[parameterCount];
      for (int p = 0; p < parameterCount; p++) {
        parameterHandlers[p] = parseParameter(p, parameterTypes[p], parameterAnnotationsArray[p]);
      }
     ...
      return new RequestFactory(this);
    }
  1. 调用create方法
okhttp3.Request create(Object[] args) throws IOException {
    //获取参数管理器
    ParameterHandler<Object>[] handlers = (ParameterHandler<Object>[]) parameterHandlers;
	//获取参数的值
    int argumentCount = args.length;
    ...
 	//生成RequestBuilder
    RequestBuilder requestBuilder = new RequestBuilder(httpMethod, baseUrl, relativeUrl,
        headers, contentType, hasBody, isFormEncoded, isMultipart);
	//argumentList中添加参数值,规范relativeUrl格式。
    List<Object> argumentList = new ArrayList<>(argumentCount);
    for (int p = 0; p < argumentCount; p++) {
      argumentList.add(args[p]);
      handlers[p].apply(requestBuilder, args[p]);
    }
	//生成网络请求
    return requestBuilder.get()
        .tag(Invocation.class, new Invocation(method, argumentList))
        .build();
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值