简单BusProvider.getInstance().post()
带来的异常不是main thread
。
如何使用Otto事件总线将事件从Service发送到Activity?
答案 0 :(得分:120)
要从任何线程(主要或背景)发布并在主线程上接收,请尝试类似
的内容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);
}
});
}
}
}
注意:对于一般方法,Jerry Wharton和https://github.com/square/otto/issues/38的“pommedeterresaute”是有用的。我只是用包装类而不是子类实现它。
答案 1 :(得分:20)
要从任何线程(主要或背景)发布并在主线程上接收,请使用以下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
,否则它会正常工作。
答案 2 :(得分:3)
如果您确定要从非主要帖子发帖,请执行此操作:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
mBus.post(new myEvent());
}
});
正如俗话所说,"保持简单和愚蠢" :)
答案 3 :(得分:2)
bus = new Bus(ThreadEnforcer.ANY);是这个问题的明确解决方案。 这就是你所要做的一切。
答案 4 :(得分: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));
}
}
}
答案 5 :(得分:0)
我做得很简单:
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
bus.post(event);
}
});
快乐编码.. :)
答案 6 :(得分:-1)
只需使用BasicBus
创建ThreadEnforcer.NONE
即可从非主线程发布事件。提到的ThreadEnforcer.MAIN
恰好相反(和默认值),它只接受来自主线程的帖子。