在这之前用过EventBus,发现到处都可以postEvent,事件的订阅者也可以指定线程。支持不同线程,先后台互相传递消息。
最近使用了下otto,模式都是一样的,eventbus3.0之前采用的是方法名前缀的方式来注册订阅者。3.0之后也采取了跟otto一样的注解的方式来注册。基本方法都是register,unregister,post
不同点在于otto更轻量级,默认的使用范围,是UI线程。mainlooper。
Bus 类里实例化了一个ThreadEnforcer enforcer 用来检验线程的。
默认的构造方法Bus();使用的是ThreadEnforcer.MAIN作为enforcer.
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());
}
}
};
如果想在非UI线程调用,可以使用public Bus(ThreadEnforcer enforcer) 构造方法,传入ThreadEnforcer.ANY
需要注意的是,订阅者执收到消息时跟发布者是在同一个线程。如果有对UI的操作还需要读者自己定义handler处理。
如果考虑的哦啊跨线程传递,最好还是考虑使用EventBus 更方便一些。