前言:项目重构,使用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);
- 更改之后,报错解决.