gpt4 book ai didi

java - 按照其元素的可用性顺序组合可观察对象

转载 作者:行者123 更新时间:2023-11-30 10:29:58 25 4
gpt4 key购买 nike

我正在尝试构建一个类似 s.startWith(x) 的运算符,但它是有条件的 - 我们称它为 s.startWithIfNothingAvailable(x)。我希望它仅在 s 在订阅时没有可用元素 的情况下为流添加 x 前缀。

让我用一个例子来说明这个想法。

s 是来自服务器的报告流。

  • 如果还没有报告到达,我想在 s 前加上一个空的 - 只是用一些东西更新 ui。
  • 如果 s 包含某些内容(可能缓存了一些报告),前缀 s 将导致呈现空报告,然后呈现非空报告。我想避免这样的眨眼。

我认为解决该问题的另一种方法是使用类似 .concat 的东西,但它根据元素的可用性对可观察对象进行排序。

Observable.concatFirstAvailable(serverReport, emptyReport),如果 serverReport 还没有元素 - 切换到 emptyReport 然后返回等待serverReport.

最佳答案

您可以合并延迟的特殊报告项目:

// imitate infinite hot service
PublishSubject<Report> service = PublishSubject.create();

// special report indicating the service has no reports
Report NO_REPORT = new Report();

AtomicBoolean hasValue = new AtomicBoolean();

service
// we'll need the main value for both emission and control message
.publish(main ->
// this will keep "listening" to main and allow a timeout as well
main.mergeWith(
// signal the empty report indicator
Observable.just(NO_REPORT)
// after some grace period so main can emit a real report
.delay(100, TimeUnit.MILLISECONDS)
// but if the main emits first, don't signal the empty report
.takeUntil(main)
)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(report -> {
if (report == NO_REPORT) {
// even if this onNext is serialized, NO_REPORT may get emitted
if (!hasValue.get()) {
// display empty report
}
} else {
// this indicates a NO_REPORT should be ignored onward
hasValue.set(true);
// display normal report
}
}, error -> { /* show error */ })

Thread.sleep(200); // Thread.sleep(50)
service.onNext(new Report());

关于java - 按照其元素的可用性顺序组合可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43818326/

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