我在我的android应用程序中使用Otto事件总线,并且遇到多次触发相同事件的问题(CGRect headerFrame = [UIScreen mainScreen].bounds;
返回相同的整数)。我用来触发事件的代码看起来像这样(简化):
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());
}
}
方法里面发生了意外的事情。
这是怎么发生的?我该怎么做才能阻止它?
答案 0 :(得分:4)
问题不在于事件实际上是多次触发,而是多次调用该处理程序。如上面的代码所示,每次创建对象时都会调用bus.register
方法;由于活动生命周期,这种情况多次发生,导致处理程序被多次调用。
感谢jonk带领我走上了正确的道路。
答案 1 :(得分:-1)
这也发生在我身上。我有一些片段使用相同的片段类来说StuffFragment,我创建了两个StuffFragment实例。因为我在StuffFragment类中订阅了Otto总线。 post方法发生一次,实际事件被触发一次。但是因为有两个实例所以当收到看起来像我们收到两个事件的事件时它会做同样的事情。