奥托事件总线未从 activity 触发到另一个 activity 片段
Otto event bus not fired from an activity to another activity with fragments
我对使用事件总线并不陌生,但在以下情况下出现了奇怪的行为:
我有 MainActivity,它有两个片段需要使用从 MainActivity 启动的 SecondActivity 的 Otto
事件总线来更新它们的内容。问题是,当 SecondActivity 启动时,MainActivity 暂停,因此,总线将在其 onPause
方法中取消注册,当 EventBus
从 SecondActivity 触发其事件时,它不会被下面的两个片段接收主要活动。
顺便说一句,MainActivity 有一个订阅者方法可以从 AsyncTask
线程接收更新,因此它也应该注册和取消注册事件总线。
这是我的 BusProvider
class 代码:
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 接收。
感谢任何有帮助的回答。
正如您正确指出的那样:
The problem is, when SecondActivity launched, MainActivity paused and thus, the bus will be unregistered inside its onPause method
一旦启动 SecondActivity,就会执行您的片段的 onPause 方法,导致它们从事件总线中注销。
所以,你需要将注册和取消注册分别移动到 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);
}
我对使用事件总线并不陌生,但在以下情况下出现了奇怪的行为:
我有 MainActivity,它有两个片段需要使用从 MainActivity 启动的 SecondActivity 的 Otto
事件总线来更新它们的内容。问题是,当 SecondActivity 启动时,MainActivity 暂停,因此,总线将在其 onPause
方法中取消注册,当 EventBus
从 SecondActivity 触发其事件时,它不会被下面的两个片段接收主要活动。
顺便说一句,MainActivity 有一个订阅者方法可以从 AsyncTask
线程接收更新,因此它也应该注册和取消注册事件总线。
这是我的 BusProvider
class 代码:
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 接收。
感谢任何有帮助的回答。
正如您正确指出的那样:
The problem is, when SecondActivity launched, MainActivity paused and thus, the bus will be unregistered inside its onPause method
一旦启动 SecondActivity,就会执行您的片段的 onPause 方法,导致它们从事件总线中注销。 所以,你需要将注册和取消注册分别移动到 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);
}