58

シンプルなBusProvider.getInstance().post()例外はありませんmain thread。Ottoイベントバスでサービスからアクティビティにイベントを送信するには?

4

7 に答える 7

122

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

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」の功績が認められています。サブクラスではなくラッパークラスで実装しました。

于 2013-03-15T13:09:29.700 に答える
20

任意のスレッド (メインまたはバックグラウンド) から投稿し、メイン スレッドで受信するMainThreadBusには、vanilla の代わりに次を使用します。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行う必要はありません。どちらか一方を実行してください。事実上ラッパーであるデニーの答えでは、Bus基本クラスはインターフェイスのように使用されているだけで、すべての機能が上書きされています。

たまたま参照経由で参照Busしない限り、基本クラスを削除しても機能します。MainThreadBusBus

于 2014-02-27T09:13:50.590 に答える
0

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

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));
        }
    }
}
于 2016-04-14T10:31:35.660 に答える