RxJava中如何基于上游结果动态设置Single.delay()延迟值?
解决RxJava中用上游结果动态设置Single延迟的问题
你的核心问题是:Single.delay(pair.first, TimeUnit.millis) 会丢弃原本的 pair 数据,仅发射一个延迟后的默认值,导致后续 doOnSuccess 无法访问 pair.two;同时变量作用域限制了 pair 无法在后续操作中被引用。
正确写法示例
要保留上游的 pair 数据并实现动态延迟,你可以用以下两种方式:
方法一:Single.timer + map 传递数据
.flatMap(o -> functionOne(para), Pair::new) .flatMap(pair -> // 延迟指定时长后,依然发射原来的pair对象 Single.timer(pair.first, TimeUnit.millis) .map(__ -> pair) ) .doOnSuccess(pair -> functionTwo(driver, pair.two))
方法二:Single.just + delay 携带源数据
.flatMap(o -> functionOne(para), Pair::new) .flatMap(pair -> Single.just(pair) .delay(pair.first, TimeUnit.millis) ) .doOnSuccess(pair -> functionTwo(driver, pair.two))
为什么你之前的尝试没效果
Single.delay(long, TimeUnit):这个重载只会延迟发射一个固定值(比如0),不会传递上游的pair数据,自然后续拿不到pair.two;delaySubscription:它是延迟订阅上游Observable,不是延迟发射结果,和你的需求不匹配;retryWhen/replayWhen:这两个是用于重试失败请求、重放已发射数据的场景,和动态延迟发射结果无关。
内容的提问来源于stack exchange,提问作者RxPleb
相关产品推荐
相关产品推荐

