Простой BusProvider.getInstance().post()
включить исключение не main thread
.
Как отправить событие из службы на активность с помощью шины событий Otto?
Как отправить событие из службы на активность с помощью шины событий Otto?
Ответ 1
Чтобы публиковать сообщения из любого потока (основного или фона) и получать в основном потоке, попробуйте что-то вроде
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 и "pommedeterresaute" в https://github.com/square/otto/issues/38 для общего подхода. Я только что реализовал его с классом-оболочкой, а не подклассом.
Ответ 2
Чтобы опубликовать любой поток (основной или фоновый) и получить в основном потоке, используйте 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);
}
});
}
}
}
Это основано на ответе Энди Денни.
Нет необходимости как расширять, так и обертывать объект Bus
, делать то или другое. В ответе Денни, который фактически является оберткой, базовый класс Bus
используется только как интерфейс, все функции перезаписываются.
Это сработало бы, даже если вы удалили базовый класс Bus
, если только вы не ссылались на MainThreadBus
с помощью ссылки Bus
.
Ответ 3
bus = новая шина (ThreadEnforcer.ANY); является ясным решением этой проблемы. Это все, что вам нужно сделать.
Ответ 4
Или просто сделайте это, если вы уверены, что отправляете сообщение из основного потока:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
mBus.post(new myEvent());
}
});
Как говорится, "Держите это просто и глупо":)
Ответ 5
Лучший пользовательский класс шины для меня
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));
}
}
}
Ответ 6
Я сделал это просто:
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
bus.post(event);
}
});
Счастливое кодирование..:)
Ответ 7
Просто создайте BasicBus
с помощью ThreadEnforcer.NONE
, чтобы отправить сообщение из не основных потоков. Упомянутый ThreadEnforcer.MAIN
является полностью противоположным (и по умолчанию), который принимает только сообщения из основного потока.