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
添加回答
舉報