8

我在我的应用程序中使用了 Greenrobot 的 EventBus,它运行良好。

但是,如果我按下后退按钮关闭应用程序,然后立即重新启动应用程序,我似乎收到了两次事件。如果我再这样做,我将收到三遍,依此类推。

我正在检查日志和调试以查看我是否有任何类的多个实例,或者我是否正在注册多次,但我看不到任何额外的类并且使用 isRegistered 返回 false。

有任何想法吗?

谢谢

4

5 回答 5

15

您的注册/注销呼叫是否正确配对?例如,如果你register()在,你在Activity.onResume()打电话吗?unregister()Activity.onPause()

关闭所有活动不会终止您的进程。即所有注册的类仍然存在,您必须从事件总线显式清理和取消注册,或者在活动返回时重用它们。

于 2015-01-24T00:01:34.583 回答
3

这是旧的,但以防万一有人也有这个问题:在动态生成的东西(如 Fragments 或其他类)中使用 EventBus 时要小心;我真的不明白他们为什么不止一次地向 EventBus 发布,但我认为这与此有关(我有不止一个动态生成的 Fragment)。一旦我将register(), unregister(),onEvent()放入父 Activity 代码(也方便地使用onPause()and onResume()),它就可以正常工作。

于 2015-08-13T20:16:13.120 回答
2

当我使用

EventBus.getDefault().postSticky(new Event("Hii !"));

用于发送事件。
当我参加该活动时,该活动被多次接收。
所以我通过在 onEvent 方法中接收后删除事件来解决这个问题。这解决了我的问题。
使用:removeStickyEvent(object)

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    public void onEvent(Event event) {
        /* Do something */
        EventBus.getDefault().removeStickyEvent(event);
}
于 2019-03-01T10:31:56.780 回答
0

我有一个具体的案例想分享。也许它可以帮助别人。当我们为项目中的所有活动使用父活动时,我们为父类中的每个活动注册和取消注册 EvenBus。在我们的一个活动中,我们在调用前一个活动的 EventBus 之前调用了 EventBas。然后我们有两次触发

于 2021-03-10T16:15:54.540 回答
0

问题不在于事件实际上被触发了多次,而是处理程序被多次调用。如上面的代码所示,每次创建对象时都会调用 bus.register 方法;由于活动的生命周期,这发生了多次,导致处理程序被多次调用。

于 2016-11-25T11:16:56.640 回答