2016-09-26 22 views
0

我想壓縮兩個observables,在這種情況下是一個計時器任務和一個實際的任務,以便我的訂閱者只有在兩個任務完成時才被調用。我想用Observable.zip來做到這一點,但不知何故,這不起作用,我的Observable.timer不叫onComplete()。這意味着用戶永遠不會得到Observables的結果。Observable.zip與Observable.timer

當我將zip更改爲merge突然Observable.timer的確稱爲onComplete(),我在這裏丟失了什麼?

Observable<Long> delayObs = Observable.timer(500, TimeUnit.MILLISECONDS); 
Observable<Void> methodObs = method(); 

mSubscription = Observable.zip(delayObs, methodObs, (pLong, pVoid) -> pVoid) 
           .subscribeOn(Schedulers.io()) 
           .observeOn(AndroidSchedulers.mainThread()) 
           .subscribe(__ -> thisDoesntGetCalled(), throwable -> M2Log.e(LOG_TAG, 
             "error", throwable)); 

的方法:

private Observable<Void> method() { 
    return Observable.defer(() -> { 
     // some work 
     return Observable.empty(); 
    }); 
} 

我失去了一些東西在這裏?

+0

郵編結合的值,但是你的方法()的可觀察到不排放任何東西,因此壓縮決定它不會能夠結合任何東西,然後完成。 – akarnokd

+0

謝謝!這實際上是有道理的。如果你發佈這個答案,我會接受它。 –

回答

1

Zip結合了值,但您的方法()的Observable不會發射任何東西,因此zip決定它將無法組合任何東西,然後完成。

你可以改變的方法來此,現在壓縮不會調用您提供的功能:

private Observable<Integer> method() { 
    return Observable.defer(() -> { 
     // some work 
     return Observable.just(1); 
    }); 
} 
相關問題