シンプルなBusProvider.getInstance().post()
例外はありませんmain thread
。Ottoイベントバスでサービスからアクティビティにイベントを送信するには?
29031 次
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
しない限り、基本クラスを削除しても機能します。MainThreadBus
Bus
于 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 に答える