消息传递机制之EventBus的使用详细

发布时间:2021-10-19 15:18:09

?EventBus是怎样管理事件总线的, 是不是最佳处理消息的方案?让我们一同来学*和认识.


EventBus由来

? ? 在面对应用程序内组件间, 组件与后台线程间的通信. 又如我们在处理耗时操作时, 等到耗时操作完成后通过Handler或者Broadcast去更新UI, 但是面对多个Activity之间需要通过Listener通信完成. 但是这些问题我们可以通过EventBus来完成.它是通过发布/订阅的方式来管理事件总线 .通过注解和反射机*┰恼吡┰暮4嫫鹄, 然后在发送订阅的时候遍历订阅函数数组进行调用, 但是这种形式会影响到EventBus的执行效力.


EventBus的介绍

? ? EventBus出自greenrobot, 与GreenDao是一家. 而EventBus3.0框架采用了建造者模式, 并加入注解, 通过注解的方式告知订阅函数运行在哪一个线程中.


EventBus主要角色
? ? Event 传递的事件对象? ? Subscriber 事件的订阅者? ? Publisher事件的发布者? ? ThreadMode 定义函数在那种线程中执行

官网给出的各种角色的协作图



public class EventInfoBean {
public String msg;
public EventInfoBean(String msg) {
this.msg = msg;
}
}

? ? 3.订阅事件


EventBus.getDefault().register(this);

? ? 4. 发布事件


EventBus.getDefault().post(new EventInfoBean("eventBus发送的消息"))

? ? 5. 解除订阅(一般放在onDestroy()中)


EventBus.getDefault().unregister(this);? ? 6.订阅事件处理

????@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EventInfoBean info) {
Toast.makeText(getApplicationContext(), "接收到的消息..." + info.msg, Toast.LENGTH_SHORT).show();
}

? ? 7.订阅事件的优先级


? ? EventBus事件的优先级类似于广播的优先级, 优先级越高优先得到消息


????@Subscribe(threadMode = ThreadMode.MAIN,priority = 100)
public void onDataSynEvent(EventInfoBean event) {
Log.e(TAG, "event---->" + event.msg);
}

? ? 8.终止事件传递


? ? EventBus在发送有序广播的时候可以终止广播的往下传递


?EventBus.getDefault().cancelEventDelivery(event) ;

? ? 9. 代码混淆


-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe ;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
(java.lang.Throwable);
}

EventBus线程模型说明

? ? ThreadMode.MAIN ?
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void onDataSynEvent(FirstEvent event){
Log.d(TAG,"sticky..." + event.getMsg() + "..." + Thread.currentThread().getName());
}

? ? 发送粘性事件


EventBus.getDefault().postSticky(new FirstEvent("粘性事件..."));

? ?? 移除粘性事件


????? ? 粘性广播属于常驻广播, 如果不需要可以移除粘性事件


????EventBus.getDefault().removeStickyEvent(new FirstEvent());

????? ? 或调用移除所有粘性事件


????EventBus.getDefault().removeAllStickyEvents();
EventBus的优缺点

? ? 优点 : 简化了各组件间的通信方式, 实现了解耦让业务代码更加简洁, 可以动态设置事件处理线程以及优先级


? ? 缺点 : 每一个事件必须自定义一个事件类, 造成事件类过多, 从而增加了维护的成本


EventBus3.0与2.X比较

1.代码更加简洁


2.性能更优. 由于EventBus 2.x?是采用反射的方式对整个注册类中的所有方法进行扫描来完成注册,因此在性能上有所影响。而EventBus3.0中提供EventBusAnnotationProcessor注解处理器在编译期通过读取Subscribe注解并解析、处理其中所包含的信息,再生成java类来保存所有订阅者的信息,从而比在运行时使用反射来获得这些订阅者的信息速度要快


以上是我个人对EventBus3.0的一些认识和理解,要是有什么地方不对的,欢迎各位同仁指正

相关文档

  • 大班升学前班育儿知识
  • 当古道走老了骏马,你会回头吗
  • 什么是缓存穿透,缓存雪崩?二者如何解决?
  • “尊师重教、传承核心价值观”主题党日活动方案
  • oppo手机电池坏了怎么办
  • STM32的JTAG和SWD模式
  • VMware Workstation 导出失败:System error:(Unknown exception). Invalid argument。
  • 一个收废品的小女孩
  • 台式机如何加固态硬盘
  • 国展书法作品欣赏
  • OLSR协议
  • 纳米机器人小医生
  • 关于张家界金鞭溪景区导游词
  • 字节跳动面试回来,想跟在金三银四准备跳槽面试的伙伴聊聊
  • 计算机工程师个人工作总结
  • 为什么我的手机桌面会出现广告怎么办
  • 并购融资的影响因素
  • golang中的目录操作
  • 悲痛的反义词和造句
  • Python学习笔记??生成器
  • 猜红字的谜语简单
  • 关于交友要真诚的名人名言
  • 酷我音乐歌单简介怎么修改内容?
  • 如何辨别红珊瑚
  • 怎么样治疗黑眼圈呢
  • 10个超漂亮的CSS 3D特效
  • c++ 实现简单的二叉树创建以及3种遍历方式
  • 在线阅读BSD/Linux源代码
  • 维吾尔语语文教学怎样激趣
  • 2017中考 关于北京中考签约的6大注意事项
  • 猜你喜欢

    电脑版