当前位置: 首页 > 知识库问答 >
问题:

Guava EventBus:暂停事件发布

程举
2023-03-14

是否有任何方法可以暂停EventBus从guava库发布的事件。

我有一个发布事件的方法(例如,SomethingChangedEvent)。现在,这个方法在循环中被另一个方法调用。问题是,每次调用changeSomething()时都会发布SomethingChangedEvent,即使只有最后一次更改才重要。由于事件的处理程序执行一些重计算,因此应用程序的性能会快速下降。

最后一次执行changeSomething()后,我想告诉guava恢复事件处理。

有没有办法告诉番石榴,除了最后一个,不要理会所有的变化?

共有1个答案

谢和颂
2023-03-14

我尝试了这个模式,它源于毒丸模式,使用子分类:

 public class SomethingChangedEvent {

        private final String name;

        public SomethingChangedEvent(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return name;
        }

    }

    public class IgnoreSomethingChangedEvent extends SomethingChangedEvent {
        public IgnoreSomethingChangedEvent(String name) {
            super(name);
        }

    }

    public class HandleSomethingChangedEvent extends SomethingChangedEvent {
        public HandleSomethingChangedEvent(String name) {
            super(name);
        }

    }

    private void eventBusTest() {
        EventBus eventBus = new EventBus();
        eventBus.register(new EventBusSomethingChanged());
        eventBus.post(new SomethingChangedEvent("process this one"));
        eventBus.post(new IgnoreSomethingChangedEvent("ignore"));
        eventBus.post(new SomethingChangedEvent("don't process this one"));
        eventBus.post(new HandleSomethingChangedEvent("handle"));
        eventBus.post(new SomethingChangedEvent("process this one bis"));
    }

    public class EventBusSomethingChanged {
        private boolean ignore;

        @Subscribe
        public void SomethingChanged(SomethingChangedEvent e) {
            if (e instanceof IgnoreSomethingChangedEvent) {
                ignore = true;
                return;
            }
            if (e instanceof HandleSomethingChangedEvent) {
                ignore = false;
                return;
            }
            if (!ignore) {
                System.out.println("processing:" + e);
            }
        }
    }
 类似资料:
  • ap.onBackgroundAudioPause(CALLBACK) 监听音乐暂停事件。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <style>.output{ display:block; max-width:

  • 暂停脚本的当前线程。 #p::Pause ; 按一次 Win+P 会暂停脚本. 再按一次则取消暂停. Pause [, On|Off|Toggle, OperateOnUnderlyingThread?] 参数 On|Off|Toggle 如果为空或省略, 则它默认为 Toggle. 否则, 请指定下列单词的其中一个: Toggle:如果在当前线程下的潜在线程处于运行状态,则暂停当前线程,否则让潜

  • ap.offBackgroundAudioPause(CALLBACK) 移除音乐暂停事件的监听。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <style>.output{ display:block; max-wid

  • 问题内容: 我有一个textarea,人们可以自然地输入一些文本,因此我想这样做,以便不时提出AJAX请求,以获取有关textarea的内容的一些建议(例如堆栈溢出的Related Questions,但是对于textarea,而不是文本输入)。问题是我不能在每次按键时都发出AJAX请求(这是无用的,而且非常消耗资源),而且我不确定这样做的最有效方法是什么(每X字?每X秒一次) ? 或者是其他东西

  • 我目前正在使用Glide库玩GIF,如下所示。 这很好,但我希望用户可以选择回放、暂停和转发GIF。我在想,只需要倒回/前进10秒的按钮和另一个暂停按钮。我不可能使用mp4视频,也不可能使用视频播放库,因为我使用的文件是GIF。在使用Glide时,我有什么方法可以做到这一点,或者我必须使用另一个库吗? 非常感谢您的帮助。

  • 1.若要暂停训练,请按下该按钮。显示暂停。若要继续训练,请点击绿色箭头图标。 2.若要停止训练,在记录训练期间或处于暂停模式时长按该按钮三秒钟,直至计数器清零。或者您可以点击并按住显示屏上的红色停止按钮。 如果在暂停后停止训练,则暂停后经过的时间不包括在总训练时间内。