2017-02-16 70 views
1

我不是新来使用事件总线,但我得到了在以下情况下奇怪的行为:奥托事件总线无法从活动发射到另一个活动与片段

我有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.

任何有用的答案被理解接收。

回答

4

正如你正确地指出:

的问题是,当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); 
} 
+0

它解决了,我很欣赏你的帮助。 – blueware

相关问题