2 回答

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
Observable.just訂閱時(shí)不運(yùn)行任何內(nèi)容。它會(huì)在您訂閱時(shí)發(fā)出元素,但您doSomethingLong將在將其作為參數(shù)傳遞后立即運(yùn)行。這很正常,這就是語(yǔ)言的工作方式。
你正在尋找的是一種在我們訂閱時(shí)返回它的方法,但也只在那個(gè)時(shí)候運(yùn)行它,并希望在后臺(tái)線程上運(yùn)行。
有幾個(gè)答案,這里有一些:
使用延遲
有一個(gè)名為的運(yùn)算符defer,它接受一個(gè) lambda,它會(huì)在您訂閱后執(zhí)行:
Observable.defer(() -> doSomethingLong())
這只會(huì)doSomethingLong在您訂閱時(shí)執(zhí)行
使用 fromCallable
您可以從 lambda 創(chuàng)建一個(gè)可觀察對(duì)象。這被稱為fromCallable:
Observable.fromCallable(() -> doSomethingLong())
同樣,這只會(huì)doSomethingLong在您訂閱時(shí)運(yùn)行
使用創(chuàng)建
我認(rèn)為這可能是最令人氣餒的做法,因?yàn)橛袔准履惚仨毺幚?,但我認(rèn)為對(duì)于完整性來(lái)說(shuō),可以提一下:
Observable.create( emitter -> {
if(emitter.isDisposed()) return;
emitter.onNext(doSomethingLong());
emitter.onComplete();
});
同樣,我確信有更多方法可以做到這一點(diǎn)。我只是想解釋這個(gè)問(wèn)題并提供一些選擇。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊
將您的 Observables 創(chuàng)建為 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
添加回答
舉報(bào)