android - 奥托事件总线未从一个 Activity 触发到另一个带有 fragment 的 Activity

标签 android android-activity event-bus otto

我对使用事件总线并不陌生,但在以下情况下出现了奇怪的行为:

我有 MainActivity,它有两个 fragment 需要使用从 MainActivity 启动的 SecondActivity 中的 Otto 事件总线更新它们的内容。问题是,当 SecondActivity 启动时,MainActivity 暂停,因此,总线将在其 onPause 方法中取消注册,而当 EventBus 从 SecondActivity 触发其事件时,它不会由 MainActivity 下的两个 fragment 接收。

顺便说一句,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 中的这段代码,我需要从中更新两个 fragment :

BusProvider.getInstance().post(new UpdateEvent("Value Updated!"));

发生的事情是 UpdateEvent 从 SecondActivity 触发,但没有被两个 fragment A 和 B 接收到。

感谢任何有帮助的回答。

最佳答案

正如您正确指出的那样:

The problem is, when SecondActivity launched, MainActivity paused and thus, the bus will be unregistered inside its onPause method

一旦启动 SecondActivity,就会执行您的 fragment 的 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);
}

关于android - 奥托事件总线未从一个 Activity 触发到另一个带有 fragment 的 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42280375/

相关文章:

android - 我们是否需要创建任何证书才能在 Android 中调用 https Web 服务

java - 如何在 Android 上使用 pocketsphinx 添加音素识别

android - onResume 中 View 为空

android - 在 View 尚未开始时使用总线?

javascript - SAPUI5事件总线: Prevent stacking the same subsciptions

android - 了解对象是否订阅了事件总线或 Otto 库中的事件

java - Android 富文本 Markdown

java - findViewByID 在 FirestoreRecyclerAdapter 中返回 null

Android:根据所选设备选择不同的布局

Android 屏幕方向已更改,不保存以编程方式添加的 TextView