簡體   English   中英

跨多個進程的Otto / EventBus

[英]Otto/EventBus across multiple processes

是否可以在一個進程中post事件(例如在具有android:process=":sync"清單屬性的SyncAdapter內部)並使用OttoEventBus在另一個android:process=":sync"中(在常規應用UI內部)接收它?

我知道IntentBroadcastReceiver可以很好地協調多個進程的通信,但我希望Otto / EventBus具有簡單性和靈活性。

不,這是不可能的,因為Otto,greenrobot的EventBus和LocalBroadcastManager都是進程內解決方案。

您可以考慮從清單中刪除android:process屬性,因此它們都在一個進程中運行。

我知道這個問題有點陳舊,但似乎有一個庫聲稱它可以處理與事件總線/ Rx樣式架構的跨進程通信。

https://github.com/edisonw/PennStation

免責聲明:我沒有嘗試過這個,只是發現了它,它聲稱做了這個問題的問題。

我知道答案已被接受,但我想我會寫一些關於我是如何解決這個問題的,如果有人遇到這個問題並且很好奇代碼的樣子。

如果您正在使用Otto,我通過從清單中刪除android:process來遵循上面接受的答案。 我也按照這里提供的答案如何使用Otto事件總線將事件從Service發送到Activity? ,因為沒有在主線程上運行而拋出了一個Bus異常。 因此,我結合了兩個答案,並根據上面的鏈接創建了一個在主線程上執行的總線。

public class MainThreadBus extends Bus {
    private final Handler mHandler = new Handler(Looper.getMainLooper());
    @Override
    public void post(final Object event) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            super.post(event);
        } else {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    MainThreadBus.super.post(event);
                }
            });
        }
    }
}

然后我創建了一個可以在應用程序中的任何位置使用的Bus單例:

public final class BusProvider {
    private static final MainThreadBus BUS = new MainThreadBus();

    public static MainThreadBus getInstance() {
        return BUS;
    }

    private BusProvider() {
    }
}

在我的SyncAdapter中,我使用以下代碼啟動事件, BusProvider.getInstance().post(event); 在我的應用程序片段中,我只是訂閱了該事件。

當應用程序處於前台以及在應用程序被刷掉后在后台啟動同步適配器時,這非常正常。

不, 但你可以使用過境 例如,使用BroadcastReceiver :在一個過程中,使用您的數據發送broadcast ,然后通過BroadcastReceiver onReceive方法的內部發布一個otto事件。

像我的代碼:

public class ReceiveMessageBroadcastReceiver extends BroadcastReceiver {

    public static final String ACTION_RECEIVE_MESSAGE
            = "me.drakeet.xxxxxx.ACTION_RECEIVE_MESSAGE";
    public static final String AGR_MESSAGE = "AGR_MESSAGE";


    // this method can be called in other processes
    public static void sendBroadcast(Context context, MessageContent content) {
        Intent intent = new Intent();
        intent.setAction(ACTION_RECEIVE_MESSAGE);
        intent.putExtra(AGR_MESSAGE, content);
        context.sendBroadcast(intent);
    }


    // this method will run in your default process, so you can post otto events to your
    // default process
    @Override public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(ACTION_RECEIVE_MESSAGE)) {
            MessageContent content = intent.getParcelableExtra(AGR_MESSAGE);
            Otto.getSeat().post(new PlayMessageReceivedEvent(content));
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM