奥托事件总线无法从活动发射到另一个活动与片段
问题描述:
我不是新来使用事件总线,但我得到了在以下情况下奇怪的行为:奥托事件总线无法从活动发射到另一个活动与片段
我有MainActivity其中有需要更新两个片段的内容使用从MainActivity启动的SecondActivity中的Otto
事件总线。问题是,当SecondActivity启动时,MainActivity暂停,因此总线将在方法内取消注册,并且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!"));
请告诉我发生的是,从所述SecondActivity火灾UpdateEvent
而不是由两个片段A和B.
任何有用的答案被理解接收。
答
正如你正确地指出:
的问题是,当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);
}
它解决了,我很欣赏你的帮助。 – blueware