otto使用和源码解析

基本同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中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值