如何使用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。