Rx java 如何定制自己的可观察对象?

Rx java 如何定制自己的可观察对象?,rx-java,observable,retrofit2,rx-java2,Rx Java,Observable,Retrofit2,Rx Java2,我正在使用rxjava2、rxjava2和适配器rxjava来实现我的http api调用 //API definition Observable<String> queryProducts(@Body Query query); //API implementation. serviceApi.queryProducts(query) .subscribeOn(new Scheduler().ioThread())

我正在使用rxjava2、rxjava2和适配器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实现中都添加它们。我想使用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());
        }
    }
有没有办法在一个超类中添加这两行代码,我不想在每个api实现中都添加它们?非常感谢。

虽然在RxJava2中可以,但它不太适合这种情况,即您希望重用公共代码而不是复制它(但用于从头开始创建可观察的,通常用于包装外部异步回调代码)。
相反,您可以使用
compose()
运算符,该运算符可以用自定义代码转换可观测值,这是向
可观测值添加公共逻辑的经典方法
您可以根据自己的需要(添加
调度器
)来学习一个示例

重新升级改造适配器,因为它正在使用反射创建服务,它不能支持自定义类,但会生成现有的RxJava类。
顺便说一句,您正在寻找/使用RxJava2的改型RxJava1适配器,您需要切换到RxJava2适配器,使用RxJava2适配器,您可以看到改型实际上使用了自己的自定义
可观察的

如果使用
compose()
对您来说还不够(因为您仍然需要将其添加到每个API中),那么正式的方法是创建您自己的
CallAdapter.Factory
并通过包装
RxJava2CallAdapterFactory
来实现改装
CallAdapter
,然后用您的自定义代码/运算符/schdeulers包装返回的
可观察的
。看这个。或者以RxJava2为例(基本相同)。

在RxJava2中,您可以,但它不太可能适合这种情况,即您希望重用公共代码而不是复制它(但用于从头开始创建可观察的,通常用于包装外部异步回调代码)。
相反,您可以使用
compose()
运算符,该运算符可以用自定义代码转换可观测值,这是向
可观测值添加公共逻辑的经典方法
您可以根据自己的需要(添加
调度器
)来学习一个示例

重新升级改造适配器,因为它正在使用反射创建服务,它不能支持自定义类,但会生成现有的RxJava类。
顺便说一句,您正在寻找/使用RxJava2的改型RxJava1适配器,您需要切换到RxJava2适配器,使用RxJava2适配器,您可以看到改型实际上使用了自己的自定义
可观察的


如果使用
compose()
对您来说还不够(因为您仍然需要将其添加到每个API中),那么正式的方法是创建您自己的
CallAdapter.Factory
并通过包装
RxJava2CallAdapterFactory
来实现改装
CallAdapter
,然后用您的自定义代码/运算符/schdeulers包装返回的
可观察的
。看这个。或者以RxJava2为例(基本相同)。

非常感谢,为我提供了巨大的帮助。嗨,Yosriz,我遵循了你的例子。我在CallAdapter类中添加了一些代码。但它似乎不起作用@重写公共对象自适应(调用){Object obj=wrapped.adapt(调用);if(obj instanceof Observable){Observable requestObservable=(Observable)obj;requestObservable.subscribeOn(Scheduler.ioThread()).observeOn(Scheduler.mainThread());return requestobservate;}return wrapped.adapt(call);}嗨,像这样的代码真的很难理解,在我看来你返回的是原始的adapted requestobservate(observate是不可变的),你必须返回操作符创建的observate,此外,我认为仅仅应用调度程序是不值得的,默认情况下,翻新可观察对象会作用于io调度程序,因此您只需要添加主线程调度程序库,这对我帮助很大。嗨,Yosriz,我遵循了您的示例。我在CallAdapter类中添加了一些代码。但它似乎不起作用@重写公共对象自适应(调用){Object obj=wrapped.adapt(调用);if(obj instanceof Observable){Observable requestObservable=(Observable)obj;requestObservable.subscribeOn(Scheduler.ioThread()).observeOn(Scheduler.mainThread());return requestobservate;}return wrapped.adapt(call);}嗨,像这样的代码真的很难理解,在我看来你返回的是原始的adapted requestobservate(observate是不可变的),你必须返回操作符创建的observate,此外,我认为仅仅应用调度程序是不值得的,默认情况下,翻新可观察对象作用于io调度程序,所以您只需要添加mainThread调度程序
//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());
        }
    }
if (rawType != Observable.class && !isSingle && !isCompletable) {
      return null;
}