如何使用Otto事件总线将服务发送到活动?

简单的BusProvider.getInstance().post()带来的exception不是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代替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); } }); } } } 

这是基于安迪·丹尼的回答。

不需要扩展和包装一个Bus对象,做一个或另一个。 在Dennie的回答中,这是一个有效的包装, Bus基类只是被用作接口,所有的function都被覆盖。

即使你删除了Bus基类,它也可以工作,除非你碰巧通过Bus引用引用了MainThreadBus

bus = new Bus(ThreadEnforcer.ANY); 是这个问题的明确解决scheme。 它所有你必须做的。

或者干脆这样做,如果你确定你是从一个非主线程发布:

 new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { mBus.post(new myEvent()); } }); 

正如俗话所说,“保持简单而愚蠢”:)

最适合我的自定义总线类

 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)); } } } 

我简单地做了:

 Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { bus.post(event); } }); 

快乐编码.. 🙂

只需使用ThreadEnforcer.NONE创buildThreadEnforcer.NONE以从非主线程发布事件。 提到的ThreadEnforcer.MAIN正好相反(和默认),它只接受来自主线程的post。