web-dev-qa-db-ja.com

Ottoイベントバスを使用してサービスからアクティビティにイベントを送信する方法

単純なBusProvider.getInstance().post()main threadではなく例外をもたらします。 Ottoイベントバスを使用してサービスからアクティビティにイベントを送信する方法

58
Mecid

任意のスレッド(メインまたはバックグラウンド)から投稿し、メインスレッドで受信するには、次のようにします。

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);
        }
      });
    }
  }
}

注:一般的なアプローチでは、クレジットはJake Whartonに送られ、 https://github.com/square/otto/issues/38 の「pommedeterresaute」に送られます。サブクラスではなくラッパークラスで実装しました。

121
Andy Dennie

任意のスレッド(メインまたはバックグラウンド)から投稿してメインスレッドで受信するには、バニラMainThreadBusの代わりに次のBusを使用します。

public class MainThreadBus extends Bus {
     private final Handler handler = new Handler(Looper.getMainLooper());

     @Override public void post(final Object event) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            super.post(event);
        } else {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    MainThreadBus.super.post(event);
                }
            });
        }
    }
}

これは、Andy Dennieの答えに基づいています。

Busオブジェクトを拡張およびラップする必要はありません。どちらか一方を実行します。事実上ラッパーであるDennieの回答では、Bus基本クラスがインターフェイスのように使用されているだけで、すべての機能が上書きされています。

Bus参照を介してMainThreadBusを参照した場合を除き、Bus基本クラスを削除しても機能します。

20
alexbirkett

または、非メインスレッドから投稿していることが確実な場合は、単にこれを実行します。

new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        mBus.post(new myEvent());
                    }
                });

Sayingにもあるように、「シンプルで愚かさを保つ」:)

3
Jiyeh

bus = new Bus(ThreadEnforcer.ANY);この問題の明確な解決策です。そのすべてはあなたがしなければなりません。

2
drlobo

私は単にそれをやった:

Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                bus.post(event);
            }

        });

ハッピーコーディング.. :)

0
Shylendra Madda

私にとって最高の実装カスタムバスクラス

public class AndroidBus extends Bus {
    private final Handler mainThread = new Handler(Looper.getMainLooper());

    @Override
    public void post(final Object event) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            super.post(event);
        } else {
            mainThread.post(() -> AndroidBus.super.post(event));
        }
    }
}
0
e.shishkin