Retrofit2源码解析(三)添加 RxJavaCallAdapterFactory适配器

本文介绍如何在Retrofit中整合RxJava,通过添加RxJavaCallAdapterFactory适配器,支持rx.Observable、rx.Single和rx.Completable等响应类型。演示了如何定义接口以接收响应数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、获取实例时,我们再添加一个适配器

        retrofit = new Retrofit.Builder().baseUrl("http://localhost:8080/campus/")
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(JacksonConverterFactory.create())
                .build();

老规则,这里只是添加了一个适配器,所以上面两篇的返回类型还是支持的。

看下RxJavaCallAdapterFactory的源码,代码比较多,但我们只需要看 CallAdapter

retrofit2.adapter.rxjava.RxJavaCallAdapterFactory.java

//支持返回类型为rx.Observable、rx.Single、rx.Completable
//根据不同的类型生成对应的CallAdapter的实现类
  @Override
  public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
    Class<?> rawType = getRawType(returnType);
    String canonicalName = rawType.getCanonicalName();
    boolean isSingle = "rx.Single".equals(canonicalName);
    boolean isCompletable = "rx.Completable".equals(canonicalName);
    if (rawType != Observable.class && !isSingle && !isCompletable) {
      return null;
    }
    if (!isCompletable && !(returnType instanceof ParameterizedType)) {
      String name = isSingle ? "Single" : "Observable";
      throw new IllegalStateException(name + " return type must be parameterized"
          + " as " + name + "<Foo> or " + name + "<? extends Foo>");
    }

    if (isCompletable) {
      return CompletableHelper.createCallAdapter(scheduler);
    }

    CallAdapter<Observable<?>> callAdapter = getCallAdapter(returnType, scheduler);
    if (isSingle) {
      return SingleHelper.makeSingle(callAdapter);
    }
    return callAdapter;
  }

所以再在可以将接口改成如下

    public interface HttpLoginRx {
        @POST("account/login")
        Observable<HashMap<String, Object>> login(@Body Account account);
    }

也是ok的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值