Rx java 如何定制自己的可观察对象?
我正在使用rxjava2、rxjava2和适配器rxjava来实现我的http api调用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())
//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;
}