単純なBusProvider.getInstance().post()
はmain thread
ではなく例外をもたらします。 Ottoイベントバスを使用してサービスからアクティビティにイベントを送信する方法
任意のスレッド(メインまたはバックグラウンド)から投稿し、メインスレッドで受信するには、次のようにします。
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」に送られます。サブクラスではなくラッパークラスで実装しました。
任意のスレッド(メインまたはバックグラウンド)から投稿してメインスレッドで受信するには、バニラ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
基本クラスを削除しても機能します。
または、非メインスレッドから投稿していることが確実な場合は、単にこれを実行します。
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
mBus.post(new myEvent());
}
});
Sayingにもあるように、「シンプルで愚かさを保つ」:)
bus = new Bus(ThreadEnforcer.ANY);この問題の明確な解決策です。そのすべてはあなたがしなければなりません。
私は単にそれをやった:
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
bus.post(event);
}
});
ハッピーコーディング.. :)
私にとって最高の実装カスタムバスクラス
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));
}
}
}