gpt4 book ai didi

java - 如果 RxJava observable 需要很长时间,你如何显示微调器?

转载 作者:搜寻专家 更新时间:2023-10-30 21:30:25 25 4
gpt4 key购买 nike

我觉得有人必须尝试过这个,但是如果一个可观察对象需要很长时间,我想不出一个好的方法来做某事。

这就是我想要的流程。

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 */);

最佳答案

您可以通过超时发布搜索 Observable 来做到这一点:

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);
});

这通过将源分成两个热 channel 来工作:第一个 channel 将运行一个 timeout 操作符,当超时时,启动另一个 Observable 并具有显示旋转控制的副作用。其中一种方法是为此使用 fromCallable 并忽略其结果(这也避免了重复)。第二条 channel 将保持不变并与超时 channel 合并以传递实际值。

关于java - 如果 RxJava observable 需要很长时间,你如何显示微调器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34326683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com