android 事件总线 -- Otto(三) ThreadEnforcer

上一篇博客,从源码的角度讲解了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);

ThreadEnforcer本身是一个接口,其内部有一个接口方法。

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就这么多了,比较简单。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值