Retrofit2.0的Converter使用

本文介绍了在Retrofit2.0中如何使用Converter进行数据转换。Retrofit的converterFactories列表按顺序匹配,用于将请求数据转换为RequestBody和将响应数据转化为ResponseBody。通过创建protobuf Converter作为示例,强调了在定义自定义Converter时需要根据Type和特定Annotation进行条件判断。同时,解释了parameterAnnotations和methodAnnotations在注解匹配中的作用。
摘要由CSDN通过智能技术生成

在Retrofit中, 不管是发送数据或是接收数据, 最基本都是通过OKHttp的RequestBody和ResponseBody来实现,但是通常为了方便,我们在定制协议的时候,不会直接使用原始的RequestBody或是ResponseBody,因此,在Retrofit中,我们就需要对它进行转换。

在Retrofit的类的定义中,有个converterFactories的List,我们可以在build时添加多个,但要注意的是,添加的顺序是有影响的。

private final List<Converter.Factory> converterFactories;

按照retrofit的逻辑,是从前往后进行匹配,如果匹配上,就忽略后面的,直接使用。

    int start = converterFactories.indexOf(skipPast) + 1;
    for (int i = start, count = converterFactories.size(); i < count; i++) {
      Converter.Factory factory = converterFactories.get(i);
      Converter<?, RequestBody> converter =
          factory.requestBodyConverter(type, parameterAnnotations, methodAnnotations, this);
      if (converter != null) {
        //noinspection unchecked
        return (Converter<T, RequestBody>) converter;
      }
    }

从上面的源码中可以看到,当factory.requestBodyConverter返回空时,表示没有匹配上,可使用下一个factory.

因此,当我们自定义converter的时候,需要进行条件判断,符合我们一定规则的才能使用。

Type

我们以创建protobuff为例。

public final class ProtoConverterFactory extends Converter.Factory {
   
  public static ProtoConverterFactory create() {
    return new ProtoConverterFactory();
  }

  @Override
  public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
      Retrofit retrofit) {
      //进行条件判断,如果传进来的Type不是
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值