上一篇博客,从源码的角度讲解了Otto的Produce(生产者)和Subscribe(订阅者)这两个类,如果你还没有看过可以点击 Produce And Subscribe 来查看。
ThreadEnforcer
有时候不知道在哪个线程收到的回调,Otto提供一个运行机制,确保收到的回调总是在自己想要的线程上。默认一个实例的所有交互都是局限于主线程上的。
现在我们回想一下,在第一篇中我们讲的构造Bus。如果忘了的,可以点击 Otto使用 查看。
// 默认的构造方法 Bus bus1 = new Bus(); // 构造运行在主线程的事件总线 Bus bus2 = new Bus(ThreadEnforcer.MAIN);
如果你不关心交互放生在哪个线程,可以使用ThreadEnforcer.ANY来构造事件总线。
Bus bus = new Bus(ThreadEnforcer.ANY);
void enforce(Bus bus);
在ThreadEnforcer内部还有两个内部类实例:
/** A {@link ThreadEnforcer} that confines {@link Bus} methods to the main thread. */ ThreadEnforcer MAIN = new ThreadEnforcer() { @Override public void enforce(Bus bus) { if (Looper.myLooper() != Looper.getMainLooper()) { throw new IllegalStateException("Event bus " + bus + " accessed from non-main thread " + Looper.myLooper()); } } };现在事件总线运行在主线程上,齐总enforce()这个回调方法中,判断当前消息队列Looper是否是主线程消息循环。如果不是主线程则抛出异常。
/** A {@link ThreadEnforcer} that does no verification. */ ThreadEnforcer ANY = new ThreadEnforcer() { @Override public void enforce(Bus bus) { // Allow any thread. } };如果自己需要额外的功能,也可以自己实现ThreadEnforcer接口。然后在构造Bus的时候传递自定义的ThreadEnforcer就行了。
好了,关于ThreadEnforcer就这么多了,比较简单。