如何自定义我自己的Observable?

时间:2017-05-19 17:58:08

标签: rx-java observable retrofit2 rx-java2

我使用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,它似乎只允许Obse​​rvable类传递这个检查点。我无法扩展和覆盖此方法,因为此类是最终类。

if (rawType != Observable.class && !isSingle && !isCompletable) {
      return null;
}

有没有办法在超类中添加这两行,我不想在每个api实现中添加它们?非常感谢。

1 个答案:

答案 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(非常相同)的示例。