2015-12-17 33 views
6

我覺得有人必須嘗試過這一點,但如果可觀察時間過長,我無法找出一個很好的方法去做某件事。如果RxJava observable需要很長時間,你如何顯示Spinner?

這是我想要的流程。

Start a search. 
If the search takes longer than some time, 
    show a spinner or show progress bar. 
When finished do subscription action and hide spinner/progress bar. 

的我能想到的最接近的是像郵編

manager.search(searchTerm) 
     .zip(Observable.Timer(1, TimeUnit.SECONDS)) 
     .subscribe(
      // if the search is non null then we are good 
      // if the long time is non 0 we need to show spinner 
     ); 

有什麼好做?我一整天都在努力,但沒有成功。在一個完美的世界,我覺得我會想是

manager.search(searchTerm) 
     .timeout(i -> /* do timeout stuff */, 1, TimeUnit.SECONDS) 
     .subscribe(item -> /* do search result stuff */); 

回答

5

您可以通過發佈搜索可觀察到通過超時做到這一點:

Observable<Integer> source = Observable.just(1).delay(5, TimeUnit.SECONDS); 

source 
.doOnSubscribe(() -> System.out.println("Starting")) 
.publish(o -> 
    o.timeout(1, TimeUnit.SECONDS, Observable.<Integer>fromCallable(() -> { 
     System.out.println("Spinning..."); 
     return null; 
    })).ignoreElements().mergeWith(o) 
) 
.toBlocking() 
.subscribe(v -> { 
    System.out.println("Hide spinner if shown."); 
    System.out.println(v); 
}); 

這是通過分裂源分爲兩個HOT車道:第一條車道將運行一個timeout運營商,當超時時,啓動另一個顯示旋轉控制的副作用的Observable。其中一種方法是使用fromCallable來忽略它的結果(這也避免了重複)。第二條車道將保持不變並與超時車道合併以提供實際值。

+0

來自'BlockingObservable'文檔:「但是對於生產應用程序來說通常是不合適的(如果你認爲你需要使用BlockingObservable,這通常表明你應該重新考慮你的設計)。」那麼何時使用阻塞observable是適當的,什麼時候不適用? – Than

+0

我會說在某些情況下可以使用BlockingObservable,當它真的提高了代碼的可讀性時。 – scana

+0

我在此處使用'BlockingObservable'進行演示,以便在查看所有的印製線之前應用程序不會退出。在製作中,你只是不要調用'toBlocking'就是這樣。 – akarnokd

相關問題