基本同EventBus
参考文件
使用的区别
1.otto的Bus类相当与EventBus中的EventBus类,它封装了otto的主要功能,但它不是个单例,每次都要用new创建出来,这样显然不是很方便,因此我们用单例模式将它封装起来(DCL)
2. 使用@Produce来发布事件
Produce注解用来生产发布事件,需要注意的是它生产事件前它需要注册,并且在生产完事件后需要取消注册。如果使用这种方法则在跳转到发布者所在的类中则会立即产生事件并触发订阅者
public class SecondActivity extends AppCompatActivity {
private Button bt_jump;
private OttoBus bus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_jump= (Button) this.findViewById(R.id.bt_jump);
bt_jump.setText("发送事件");
bt_jump.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
bus=OttoBus.getInstance();
***********************
bus.register(this);
}
*************************************
@Produce
public BusData setInitialContent() {
return new BusData("刘望舒的博客更新了");
}
@Override
protected void onDestroy() {
super.onDestroy();
bus.unregister(this);
}
}
跳转到SecondActivity时,MainActivity会马上收到事件,而不是按下按钮后才会收到
源码分析
构造
ThreadEnforcer.MAIN意味着默认在主线程中调度事件,
identifier为Bus的名称,默认为”default”,
HandlerFinder,用于在register、unregister的时候寻找所有的subscriber和producer。
默认传入HandlerFinder.ANNOTATED这个对象
HandlerFinder ANNOTATED = new HandlerFinder() {
@Override
public Map<Class<?>, EventProducer> findAllProducers(Object listener) {
return AnnotatedHandlerFinder.findAllProducers(listener);
}
@Override
public Map<Class<?>, Set<EventHandler>> findAllSubscribers(Object listener) {
return AnnotatedHandlerFinder.findAllSubscribers(listener);
}
};
"Map<Class<?>, EventProducer>"中推断出一个注册类只能有一个发布者,却可以有多个订阅者。findAllProducers方法最终调用的是AnnotatedHandlerFinder的findAllProducers方法:
注册
以注册类为key,分别把注册类别 和发布者,注册类别 和订阅者构成两队entry,分别放入到produces,subscribes两个map中。