RxJava在Scheduler.io()线程中不起作用

时间:2016-06-23 13:40:56

标签: java rx-java

问题在于:我有ObservableSubscriber。我尝试在Observable线程中启动.io(),因为它适用于文件和zip存档(我不会显示代码 - 太大了),但Observable什么都不做! :

Observable<Double> creatingObservable = getCreatingObservable(image);
Subscriber<Double> creatingSubscriber = getCreatingSubscriber();

creatingObservable
        .subscribeOn(Schedulers.io())
        .subscribe(creatingSubscriber);

如果我在没有subscribeOn()的情况下启动代码 - 所有工作。有什么问题以及如何解决它

P.S。 System.out.println()也不起作用。问题有调度程序的所有线程。

3 个答案:

答案 0 :(得分:7)

似乎问题是主线程在creatingObservable之前终止可以发出任何值。

简单的解决方案:让主线程等待足够长的时间以使creatingObservable能够发出/完成。

Observable<Double> creatingObservable = getCreatingObservable(image);
Subscriber<Double> creatingSubscriber = getCreatingSubscriber();

creatingObservable
        .subscribeOn(Schedulers.io())
        .subscribe(creatingSubscriber);

Thread.sleep(5000); //to wait 5 seconds while creatingObservable is running on IO thread

答案 1 :(得分:3)

试试这个:

Subscriber<Double> creatingSubscriber = getCreatingSubscriber();
Observable.defer(new Func0<Observable<Double>>() {
    @Override
    public Observable<Double> call() {
        return getCreatingObservable(image);
    }
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(creatingSubscriber);

别忘了添加:

compile 'io.reactivex:rxandroid:1.2.1'

从这里开始:https://github.com/ReactiveX/RxAndroid

解释

getCreatingObservable(image); - 很可能你会使用一些“硬”的运算符。在电话会议中工作。

例如:

Observable.just(doSomeStuff())
    .subscribeOn(...)
    .observeOn(...)

因此,执行过程将是:

1)。计算doSomeStuff()

2)。将结果传递给Observable.just()

3)。并且只通过你正在应用调度程序

换句话说,你正在努力做到这一点。首先工作,然后应用调度程序。

这就是您需要使用Observable.defer()

的原因

如需更多解释,请阅读Dan Lew的这篇文章:
http://blog.danlew.net/2014/10/08/grokking-rxjava-part-4/

旧的慢代码

部分

答案 2 :(得分:1)

在这种情况下,您只需创建一次observable app。您可以尝试使用 Observable.defer(()-> creatingObservable)所以.defer运算符每次都会强制进行可观察的创建。

Observable.defer(new Func0<Observable<Double>>() {
            @Override
            public Observable<Double> call() {
                return getCreatingObservable();
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(Schedulers.io())
        .subscribe(getCreatingSubscriber);