Unable to create call adapter for class io.reactivex.Observable

前言:项目重构,使用rxjava2+retrofit2等搭建网络部分,测试时报错:Unable to create call adapter for class io.reactivex.Observable.然后就是百度1小时,网上更多的情况跟retrofit2-rxjava2-adapter相关,但是我的不是啊,1个小时都没有找到答案,作为一只老鸟,自然不服气,决定自己思考,然后花了20分钟解决了,因为的确是个小问题,思路也对了.此时,同时觉得自己过多的依赖了工具,较少的去独立思考,因此记录下该笔记提醒一下自己.我会按照问题是如何产生,然后该如何排查的路线写该笔记.

一.问题分析

先要确定问题可能出现的几个地方,如依赖,Retrofit的创建,APIService类,在就是具体的请求,代码一一贴出;

  • 1.1.依赖
"rxjava2"                                : "io.reactivex.rxjava2:rxjava:2.2.8",
"rxandroid2"                             : "io.reactivex.rxjava2:rxandroid:2.1.1",
"retrofit2"                              : "com.squareup.retrofit2:retrofit:2.5.0",
"interceptor"                            : "com.squareup.okhttp3:logging-interceptor:3.13.1",
"retrofit2:adapter"                      : "com.squareup.retrofit2:adapter-rxjava2:2.5.0",
"gson"                                   : "com.google.code.gson:gson:2.8.5",
"converter-gson"                         : "com.squareup.retrofit2:converter-gson:2.5.0",
  • 1.2.Retrofit的创建
 private static final Retrofit RETROFIT_CLIENT = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(OKHttpHolder.OK_HTTP_CLIENT)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//报相同的错,网上更多的情况跟该位置相关
                .addConverterFactory(GsonConverterFactory.create())
                .build();
  • 1.3.APIService类
//登录
@FormUrlEncoded
@POST("xxx/url")
Observable userLogin(@Field("zhanghao") String mail, @Field("mima") String passwd);
  • 1.4.具体的请求
RxUtils.getInstance()
		.getApiObservable(ServiceHolder.getAPIService().userLogin("zhanghao", "mima"),
                new RxObserver<JavaBean>() {
            @Override
            public void onSuccess(JavaBean javaBean) {
            }
            @Override
            public void onFailure(Throwable e) {
            }
        });

public void getApiObservable(Observable observable, Observer observer){
        observable.compose(schedulers_io_main())				
                .compose(exceptionTransformer())					
                .map(ResultTransform.getInstance())					//数据剥壳:如得到的数据为ApiResponse<T>,只需要T即可
                .subscribe(observer);
}

public class ApiResponse<T> {
    private String code;
    private int stat;
    private String msg;
    private T data;
}

二.问题产生

  • 报错跟1.3和1.4的数据剥壳有关系;
  • 最开始把问题产生的思路1.1.和1.2.当中,花了一些时间;说了那么多废话,直接说问题的原因吧.

三.处理方法

  • 将1.3中的内容更改
@FormUrlEncoded
@POST("xxx/url")
Observable<ApiResponse<JavaBean>> userLogin(@Field("zhanghao") String mail, @Field("mima") String passwd);
  • 更改之后,报错解决.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值