我对使用事件总线并不陌生,但在下面的场景中我发现了一些奇怪的行为:
我有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两个片段所接收。
如有任何有帮助的答案,我们将不胜感激。
发布于 2017-02-16 18:21:50
正如你正确指出的那样:
问题是,当SecondActivity启动时,MainActivity暂停了,因此,总线将在其onPause方法中被取消注册。
一旦启动onPause,您的片段的SecondActivity方法就会被执行,导致它们从事件总线中注销。因此,您需要将寄存器和取消寄存器分别移动到onCreate和onDestroy中,分别为。
FragmentA和FragmentB事件总线代码应该是:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bus.register(this);
}
@Override
public void onDestroy() {
super.onDestroy();
bus.unregister(this);
}https://stackoverflow.com/questions/42280375
复制相似问题