我不是新手使用事件总线,但我在以下情况下遇到了奇怪的行为:
我有MainActivity,它有两个片段,需要使用从MainActivity启动的SecondActivity的Otto
事件总线更新其内容。问题是,当SecondActivity启动时,MainActivity暂停,因此,总线将在其onPause
方法中取消注册,当EventBus
从SecondActivity触发其事件时,它将不会被两个片段接收MainActivity。
顺便说一句,MainActivity有一个订阅者方法从AsyncTask
线程接收更新,因此它也应该注册和取消注册事件总线。
这是我的BusProvider
班级代码:
public class BusProvider {
private static final Bus BUS = new Bus(ThreadEnforcer.ANY);
public static Bus getInstance() {
return BUS;
}
private BusProvider() {
}
}
以下是MainActivity的事件总线代码:
@Override
protected void onResume() {
super.onResume();
bus.register(this);
}
@Override
protected void onPause() {
super.onPause();
bus.unregister(this);
}
@Subscribe
public void onAsyncResult(SomeEvent event) {
// do something
}
这是我的FragmentA和FragmentB事件总线代码:
@Override
protected void onResume() {
super.onResume();
bus.register(this);
}
@Override
protected void onPause() {
super.onPause();
bus.unregister(this);
}
@Subscribe
public void onValueUpdate(UpdateEvent event) {
mTvValue.setText(event.value);
}
现在这个代码在SecondActivity中,我需要更新它的两个片段:
BusProvider.getInstance().post(new UpdateEvent("Value Updated!"));
发生的事情是UpdateEvent
从SecondActivity发出但未被两个片段A和B接收。
感谢任何有用的答案。
答案 0 :(得分:5)
正如你正确指出:
问题是,当SecondActivity启动时,MainActivity暂停,因此,总线将在其onPause方法中取消注册
启动SecondActivity后,您的片段'onPause方法正在执行,导致它们从事件总线取消注册。 因此,您需要分别移动注册和取消注册到onCreate和onDestroy
FragmentA和FragmentB事件总线代码应为:
evil