我觉得有人必须尝试这个,但如果一个观察者需要很长时间,我无法想出一个很好的方法来做某事.
这是我想要的流程.
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.
我能想到的最接近的就像一个Zip
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 */);
akarnokd.. 7
您可以通过超时发布搜索Observable来完成此操作:
Observablesource = Observable.just(1).delay(5, TimeUnit.SECONDS); source .doOnSubscribe(() -> System.out.println("Starting")) .publish(o -> o.timeout(1, TimeUnit.SECONDS, Observable. fromCallable(() -> { System.out.println("Spinning..."); return null; })).ignoreElements().mergeWith(o) ) .toBlocking() .subscribe(v -> { System.out.println("Hide spinner if shown."); System.out.println(v); });
这通过将源分成两个热通道来工作:第一个通道将运行一个timeout
操作员,当超时时,启动另一个具有显示旋转控制的副作用的Observable.其中一种方法是使用fromCallable
它并忽略其结果(这也避免了重复).第二个通道将保持不变并与超时通道合并以提供实际值.
您可以通过超时发布搜索Observable来完成此操作:
Observablesource = Observable.just(1).delay(5, TimeUnit.SECONDS); source .doOnSubscribe(() -> System.out.println("Starting")) .publish(o -> o.timeout(1, TimeUnit.SECONDS, Observable. fromCallable(() -> { System.out.println("Spinning..."); return null; })).ignoreElements().mergeWith(o) ) .toBlocking() .subscribe(v -> { System.out.println("Hide spinner if shown."); System.out.println(v); });
这通过将源分成两个热通道来工作:第一个通道将运行一个timeout
操作员,当超时时,启动另一个具有显示旋转控制的副作用的Observable.其中一种方法是使用fromCallable
它并忽略其结果(这也避免了重复).第二个通道将保持不变并与超时通道合并以提供实际值.