2017-02-16 65 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

相關問題