简单BusProvider.getInstance().post()
会带来异常,而不是main thread
。如何使用Otto事件总线将事件从服务发送到活动?
发布于 2013-03-15 21:09:30
要从任何线程(主线程或后台线程)发布并在主线程上接收,请尝试如下所示
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);
}
});
}
}
}
注:一般方法归功于杰克·沃顿和https://github.com/square/otto/issues/38的"pommedeterresaute“。我只是用包装器类而不是子类来实现它。
发布于 2014-02-27 17:13:51
要从任何线程(主线程或后台线程)发布并在主线程上接收,请使用以下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
对象,只需其中之一。在丹尼的回答中,它实际上是一个包装器,Bus
基类只是像一个接口一样使用,所有的功能都被覆盖了。
即使您删除了Bus
基类,它也可以工作,除非您碰巧通过Bus
引用引用了MainThreadBus
。
发布于 2016-11-25 12:06:19
或者,如果你确定你是从一个非主线程发帖的,那么简单地这样做:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
mBus.post(new myEvent());
}
});
正如俗语所说,“保持简单和愚蠢”:)
https://stackoverflow.com/questions/15431768
复制相似问题