2015-12-17 31 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

相关问题