奥托事件总线没有从活动中发射到另一个带有碎片的活动

时间:2017-02-16 17:05:16

标签: android android-activity event-bus otto

我不是新手使用事件总线,但我在以下情况下遇到了奇怪的行为:

我有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接收。

感谢任何有用的答案。

1 个答案:

答案 0 :(得分:5)

正如你正确指出:

  

问题是,当SecondActivity启动时,MainActivity暂停,因此,总线将在其onPause方法中取消注册

启动SecondActivity后,您的片段'onPause方法正在执行,导致它们从事件总线取消注册。 因此,您需要分别移动注册和取消注册到onCreate和onDestroy

FragmentA和FragmentB事件总线代码应为:

evil