【发布时间】:2017-05-19 17:58:08
【问题描述】:
我正在使用retrofit2、rxjava2 和adapter-rxjava 来实现我的http api 调用。
//API definition
Observable<String> queryProducts(@Body Query query);
//API implementation.
serviceApi.queryProducts(query)
.subscribeOn(new Scheduler().ioThread())
.observeOn(new Scheduler().mainThread())
.subscribe(new Observer());
如果我有很多api需要实现,每个单独的api实现都需要添加这两行:
.subscribeOn(new Scheduler().ioThread())
.observeOn(new Scheduler().mainThread())
我不想在每个 api 实现中添加它们。我想使用 MyObservable 作为我的 api 定义的结果类型。
我的想法如下:
//API definition
MyObservable<String> queryProducts(@Body Query query);
//MyObservable definition
public class MyObservable<T> extends Observable<T> {
/**
* Creates an Observable with a Function to execute when it is subscribed to.
* <p>
* <em>Note:</em> Use {@link #create(OnSubscribe)} to create an Observable, instead of this constructor,
* unless you specifically have a need for inheritance.
*
* @param f {@link OnSubscribe} to be executed when {@link #subscribe(Subscriber)} is called
*/
protected MyObservable(OnSubscribe<T> f) {
super(f);
this.subscribeOn(new Scheduler().ioThread());
this.observeOn(new Scheduler().mainThread());
}
}
当我运行它时,我得到了以下异常:
java.lang.IllegalArgumentException:无法创建调用适配器 MyObservable。
我在以下位置跟踪了 RxJavaCallAdapterFactory.java 代码 https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit2/adapter/rxjava/RxJavaCallAdapterFactory.java。我在第 100 行找到了 RxJavaCallAdapterFactory,它似乎只让 Observable 类通过这个检查点。我不能扩展和覆盖这个方法,因为这个类是一个最终类。
if (rawType != Observable.class && !isSingle && !isCompletable) {
return null;
}
有没有办法在超类中添加这两行,我不想在每个 api 实现中添加它们?非常感谢。
【问题讨论】:
标签: rx-java observable retrofit2 rx-java2