问题在于:我有Observable
和Subscriber
。我尝试在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()也不起作用。问题有调度程序的所有线程。
答案 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);