You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过布尔标志(如animationRunning)暂停RxJava链的发射项传递?

推荐的RxJava实现方案

针对你需要在animationRunning为true时暂存事件,直到标志变为false再下发的需求,我推荐使用RxJava内置的switchMap+buffer组合方案,既简洁又能完美匹配你的弹珠图场景。

核心思路

把布尔标志转化为Observable流,根据它的状态切换事件的处理逻辑:

  • 当animationRunning为true时,用buffer缓存所有发射的事件,直到标志变为false时一次性输出缓存的全部内容
  • 当animationRunning为false时,直接透传源Observable的事件

代码实现

假设你已经有:

  • 源事件流Observable<Integer> source(对应你弹珠图里的---(1)---(2)--------------------------------)
  • 布尔标志的Observable流Observable<Boolean> animationState(对应(true)---------------(false)---------)

具体代码如下:

import io.reactivex.rxjava3.core.Observable;
import static io.reactivex.rxjava3.functions.Functions.identity;

// 共享源订阅,避免重复触发源事件
Observable<Integer> finalStream = source.publish(publishedSource -> 
    animationState
        // 只在布尔值变化时触发后续逻辑,避免无效切换
        .distinctUntilChanged()
        .switchMap(isRunning -> {
            if (isRunning) {
                // 动画运行时:缓存事件,直到标志变为false才输出
                return publishedSource
                    .buffer(animationState.filter(state -> !state))
                    .flatMapIterable(identity());
            } else {
                // 动画停止时:直接透传事件
                return publishedSource;
            }
        })
);

代码解释

  1. publish操作符:共享源Observable的订阅,确保不管后续分支有多少订阅,源事件只会被发射一次,避免重复处理。
  2. distinctUntilChanged:过滤掉布尔流中连续重复的值,只有当animationRunning的状态从true变false或反之,才会触发switchMap。
  3. switchMap分支处理:
    • 当isRunning为true时,buffer(animationState.filter(state -> !state))会缓存所有事件,直到animationState发射false,此时buffer会把缓存的所有事件打包成List发射出来,再通过flatMapIterable把List拆成单个事件,完美匹配你要的延迟下发效果。
    • 当isRunning为false时,直接返回源流,事件实时下发。

边界场景验证

  • 初始状态为true:源事件会被缓存,直到animationRunning变为false时一次性输出所有缓存事件。
  • 状态频繁切换:比如true→false→true→false,每次切换到false时都会输出对应true阶段缓存的所有事件,不会丢失。
  • 动画停止时的实时事件:当animationRunning为false时,源发射的事件会直接到达订阅端,没有延迟。

内容的提问来源于stack exchange,提问作者Artem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:45:54