我在我的android应用程序中使用Otto事件总线,遇到相同事件多次被触发的问题(event.hashCode()返回相同的整数)。我用来触发事件的代码看起来如下(简化):
public class MyFragment extends MyCustomFragment {
@Inject Bus eventBus;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
App.getComponent(getActivity()).inject(this); // use dagger to inject the event bus
}
// called from within `onOptionsItemSelected`
public void handleOptionsItemXy() {
AlertDialog.Builder a = new AlertDialog.Builder(getActivity())
// ...
.setPositiveButton(R.string.button_label_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// EVENT IS FIRED HERE
Log.d("INFO", "This log message is only displayed once!");
eventBus.post(new Event(EVENT_DATA));
}
});
}
}然后,我有一个类来处理这样的事件,它是在我的MainActivity.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方法内部似乎发生了一些意外的事情。
这是怎么发生的?我能做些什么来阻止它呢?
发布于 2015-11-26 16:37:30
问题不在于事件实际上是多次触发,而是处理程序被多次调用。如上面的代码所示,每次创建对象时都调用bus.register方法;由于活动生命周期的关系,这种情况发生了多次,导致多次调用处理程序。
感谢jonk带领我走上正确的道路。
发布于 2017-04-12 20:51:32
我也在发生这种事。我有一些片段使用相同的片段类,称为StuffFragment,我创建了两个StuffFragment实例。因此,因为我在StuffFragment类中订阅了Otto总线。post方法只发生一次,实际事件只触发一次。但是,由于有两个实例,所以在接收事件时,它将执行相同的操作,这看起来就像我们收到了两个事件。
https://stackoverflow.com/questions/33943071
复制相似问题