Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Otto EventBus:事件已激发多次_Java_Android_Otto - Fatal编程技术网

Java Otto EventBus:事件已激发多次

Java Otto EventBus:事件已激发多次,java,android,otto,Java,Android,Otto,我在android应用程序中使用Otto事件总线,但存在相同事件被多次触发的问题(event.hashCode()返回相同的整数)。我用于触发事件的代码如下所示(简化): 然后我有一个类来处理这样的事件,它是在我的main活动中创建的。onCreate: public class StuffManager { @Inject Bus bus; public StuffManager(Activity ctx) { App.getComponent(ctx).in

我在android应用程序中使用Otto事件总线,但存在相同事件被多次触发的问题(
event.hashCode()
返回相同的整数)。我用于触发事件的代码如下所示(简化):

然后我有一个类来处理这样的事件,它是在我的
main活动中创建的。onCreate

public class StuffManager {
    @Inject Bus bus;

    public StuffManager(Activity ctx) {
        App.getComponent(ctx).inject(this);
        bus.register(this);
    }

    @Subscribe
    public void manageStuff(Event event) {
        Log.d("SYNC", "Some event needs to be managed");
        Log.d("SYNC", "HASH: " + event.hashCode());
    }
}
日志消息仅显示一次,事件仅在该特定位置创建。事件总线提供的
.post
方法中似乎发生了意外情况


这是怎么发生的?我能做些什么来防止它?

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


感谢您引导我走上正确的道路。

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


感谢你引导我走上了正确的道路。

这也发生在我身上。我有一些片段使用相同的片段类StuffFragment,我创建了StuffFragment的两个实例。因为我在StuffFragment类中订阅了Otto总线。post方法发生一次,实际事件触发一次。但是因为有两个实例,所以它在接收事件时会做相同的事情,看起来我们收到了两个事件。

我也遇到了这种情况。我有一些片段使用相同的片段类StuffFragment,我创建了StuffFragment的两个实例。因为我在StuffFragment类中订阅了Otto总线。post方法发生一次,实际事件触发一次。但是因为有两个实例,所以它在接收事件时会做相同的事情,看起来我们收到了两个事件。

你为什么认为事件被多次触发?我编辑了主要帖子来回答你的问题。你确定你不只是有多个
StuffManager
实例吗?奥托也会根据带注释方法的param类型匹配侦听器,因此对于事件类名称,您应该比
Event
更具描述性,否则您可能会到处都有侦听器。。。除非出于示例的目的对其进行了简化。是什么让你相信事件被多次触发?我编辑了主要帖子来回答你的问题。你确定你没有简单地拥有多个
StuffManager
?此外,otto将根据带注释方法的参数类型匹配侦听器,因此,对于事件类名称,您应该比
Event
更具描述性,否则您可能会到处都有侦听器。。。除非为了举例的目的也简化了。我怀疑可能是这样的:P高兴我能帮忙。我怀疑可能是这样的:P高兴我能帮忙。答案是提出解决方案,请使用注释详细说明问题。答案是提出解决方案,请使用注释详细说明问题。
public class StuffManager {
    @Inject Bus bus;

    public StuffManager(Activity ctx) {
        App.getComponent(ctx).inject(this);
        bus.register(this);
    }

    @Subscribe
    public void manageStuff(Event event) {
        Log.d("SYNC", "Some event needs to be managed");
        Log.d("SYNC", "HASH: " + event.hashCode());
    }
}