我使用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实现中添加它们?非常感谢。
答案 0 :(得分:2)
虽然在RxJava2中你可以safely extend Observable,但它不太适合你希望重用公共代码而不是重复它的这种情况(但是从头开始创建Observable,通常用于包装外部异步回调代码) 。
相反,您可以使用compose()
运算符将Observable与您的自定义代码进行转换,并且将常用逻辑添加到Observable
是经典的。
您可以根据自己的需要关注Dan Lew's article示例(添加Schedulers
)。
重新改造改装适配器,因为它使用反射创建服务,它不支持自定义类,但会生成现有的RxJava类。
顺便说一句,您正在寻找/使用RxJava2改装RxJava1适配器,您需要切换到RxJava2适配器,使用RxJava2适配器,您可以看到实际改造使用自己的自定义Observable
类。
如果使用compose()
对您来说还不够(因为您仍然需要将其添加到每个API),那么正式创建自己的CallAdapter.Factory
并实施改造{{1通过包装CallAdapter
委托适应它,然后用你的自定义代码/运算符/ schdeulers包装返回RxJava2CallAdapterFactory
。见tutorial。或者在某些library I'm working on使用RxJava2(非常相同)的示例。