2 回答
TA贡献1898条经验 获得超8个赞
Observable.just订阅时不运行任何内容。它会在您订阅时发出元素,但您doSomethingLong将在将其作为参数传递后立即运行。这很正常,这就是语言的工作方式。
你正在寻找的是一种在我们订阅时返回它的方法,但也只在那个时候运行它,并希望在后台线程上运行。
有几个答案,这里有一些:
使用延迟
有一个名为的运算符defer,它接受一个 lambda,它会在您订阅后执行:
Observable.defer(() -> doSomethingLong())
这只会doSomethingLong在您订阅时执行
使用 fromCallable
您可以从 lambda 创建一个可观察对象。这被称为fromCallable:
Observable.fromCallable(() -> doSomethingLong())
同样,这只会doSomethingLong在您订阅时运行
使用创建
我认为这可能是最令人气馁的做法,因为有几件事你必须处理,但我认为对于完整性来说,可以提一下:
Observable.create( emitter -> {
if(emitter.isDisposed()) return;
emitter.onNext(doSomethingLong());
emitter.onComplete();
});
同样,我确信有更多方法可以做到这一点。我只是想解释这个问题并提供一些选择。
TA贡献1829条经验 获得超9个赞
将您的 Observables 创建为 Observable.fromCallable{}。而不是 zip 使用 combineLatest()
文档: http ://reactivex.io/RxJava/javadoc/io/reactivex/Observable.html#fromCallable-java.util.concurrent.Callable- http://reactivex.io/documentation/operators/combinelatest.html
添加回答
举报