Android-EventBus 使用以及区别
使用详解以及各版本的一些区别, 在了解版本区别之前先简单了解一下。
EventBus文档 http://greenrobot.org/eventbus/documentation
EventBus源码 https://github.com/greenrobot/EventBus
EventBus是什么?
EventBus是一种发布者和订阅者的事件分发模式。可以这么理解,比如我们订阅的Android Weekly,每当星期一0点这个时候,Android WeekLy公司,都会以邮件的形式通知我们。
目前有多个库都开发了这样的功能。它有以下的优点:
- 方法库较小
- 便于集成
- 使用简单
我们为什么要使用EventBus?
EventBus是彻底解耦的观察者模式。我们常常用在对象一对多的情况,使一个对象发生改变的时候,所有依赖的对象能够得到通知并更新。 比如我们在实际的开发中,当用户登录了,我们多个页面需要根据登录后的信息更改页面UI。这时,登录界面就是发布者,而其他的页面就是订阅者。它 们都在订阅用户信息变化的消息。 再比如我们的Fragment间的通信。
EventBus 1.0.5.1:
implementation 'org.simple:androideventbus:1.0.5.1'
复制代码
使用:
注意:官方是推荐将注册写到onStart,将注销写到onStop中,当然你也可以跟具自己的需求来改变的。
sticky 在注册期间,所有粘性订户方法将立即获得之前发布的粘性事件。
我在项目中碰到一个小问题就是我在A 界面发送一个粘性事件 在B 界面接受,如果 控件还未初始化完成,EventBus就已经注册了,那么在监听方法中的控件就未初始化,使用时也就为空。
@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_register);EventBus.getDefault().register(this);initView();}
复制代码
1.注册onCreate()中:
EventBus.getDefault().register(this);
复制代码
2.解除注册onDestroy方法:
EventBus.getDefault().unregister(this);
复制代码
3.监听(自定义方法即可,1.0是根据@Subscriber(tag=“resultData”)):
@Subscriber(tag = "resultData") public void resultData(String data) { TextView.setText(data); }
复制代码
4.发布事件 :
EventBus.getDefault().post(string,“resultData”);
复制代码
EventBus 2.4.1:
implementation'de.greenrobot:eventbus:2.4.1'
复制代码
使用:
1.注册onCreate()中:
EventBus.getDefault().register(this);
复制代码
2.解除注册onDestroy方法:
EventBus.getDefault().unregister(this);
复制代码
3.新建event类 :
public class MainEvent {private String message;public MainEvent(String message) {this.message = message;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}}
复制代码
- 监听:
必须重写约定好的方法。
EventBus 在3.0.0版本以下的接收事件方法都是在约定好的方法进行接收。EventBus提供了以下几个方法进行接收事件:
onEvent() :执行在发送事件的线程。
onEventMainThread 代表这个方法会在UI线程执行。
onEventPostThread :代表这个方法会在当前发布事件的线程执行。
onEventBackgroundThread :事件处理是在后台线程,但事件处理时间还是不应该太长, 因为如果发送事件的线程是后台线程,会直接执行事件, 如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件, 如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。
onEventAsync :每个事件会开启一个线程(有线程池),但最好限制线程的数目 。
public void onEvent(MainEvent event) {if (TextUtils.isEmpty(event.getName()))return;Toast.makeText(this, event.getName(), Toast.LENGTH_SHORT).show();}
复制代码
- 发布事件:
EventBus.getDefault().post(new MainEvent("Hello everyone"));
复制代码
EventBus 3.1.1:
implementation 'org.greenrobot:eventbus:3.1.1'
复制代码
使用:
- 注册onCreate()中:
EventBus.getDefault().register(this);
复制代码
- 解除注册onDestroy方法:
EventBus.getDefault().unregister(this);
复制代码
新建event类 :
监听:
threadMode指线程模式, priority指事件的优先级, sticky是否为粘性事件
threadMode 就是旧版本接收信息运行的方法:
- NAIN UI主线程
- BACKGROUND 后台线程
- POSTING 和发布者处在同一个线程(默认)
- ASYNC 异步线程
priority 其实和Boardcast接收者的优先级差不多,数越大优先级越高,一般0-100。默认为0
sticky 在注册期间,所有粘性订户方法将立即获得之前发布的粘性事件
@Subscribepublic void getEventBus(RegisterEvent event){(...)}@Subscribe(threadMode = ThreadMode.POSTING, priority = 2, sticky = true) public void getEventBus(RegisterEvent event){(...)}
复制代码
- 发布事件:
//发布普通事件EventBus.getDefault().post(new RegisterEvent());//发布粘性事件EventBus.getDefault().postSticky(new RegisterEvent());
复制代码
- 移除粘性事件:
//移除粘性事件EventBus.getDefault().removeStickyEvent(new RegisterEvent());//移除所有粘性事件EventBus.getDefault().removeAllStickyEvents();
复制代码
EventBus优缺点:
优点:插件大小合适,仅54K ,
简化组件之间的通信方式,实现解耦让业务代码更加简洁,可以动态设置事件处理线程以及优先级
缺点:每个事件都必须自定义一个事件类,造成事件类太多,无形中加大了维护成本
EventBus 3.1.1与2.4.1的区别 :
代码更加简洁: EventBus 2.4.1 必须定义以onEvent开头的几个方法,代码中语境比较突兀,且有可能会导致拼写错误
EventBus 3.1.1 函数名字不再受到权限,而且可以在一个函数中体现出在哪个线程执行,并且可指定接收事件的优先级。
性能 :
EventBus 2采用反射的方式对整个注册的类的所有方法进行扫描来完成注册,会有性能上的影响。
EventBus 3中EventBus提供了EventBusAnnotationProcessor注解处理器来在编译期通过读取@Subscribe()注解并解析、处理其中所包含的信息,然后生成java类来保存所有订阅者关于订阅的信息,这样就比在运行时使用反射来获得这些订阅者的信息速度要快。
如有不对的地方欢迎大家指正交流。
转载于:https://juejin.im/post/5cadb2536fb9a0687d1167ae
Android-EventBus 使用以及区别相关推荐
- android EventBus的简单使用
今天,简单讲讲Android里关于EventBus的使用. 这几天,由于面试的缘故,我听到了很多Android的流行框架,但是之前自己在公司做APP时并没有使用,所以没有了解.于是在网上查找了资料,学 ...
- Android @id和@+id区别
Android中的组件需要用一个int类型的id属性值来表示.id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等.如果在@后面使用"+" ...
- android EventBus的简单使用
今天,简单讲讲Android里关于EventBus的使用. 这几天,由于面试的缘故,我听到了很多Android的流行框架,但是之前自己在公司做APP时并没有使用,所以没有了解.于是在网上查找了资料,学 ...
- android 上午零点格式,Android零点一度的区别——Matrix
2013-07-07 导语:Matrix是android中对图像绘制的处理(旋转.放缩.平移等等),貌似书本翻页就是用这种方式处理的 正文: 1.基于坐标(px,py)旋转degrees度, post ...
- Android与IOS测试区别
Android与IOS测试区别 Android与IOS测试区别 Android与IOS测试区别 Android开源,IOS非开源. 测试工具不同(由于Android开源,IOS非开源,Android自 ...
- Android SDK与JDK区别和联系
Android SDK Android SDK(Soft Development Kit)全称为安卓软件开发工具包,***(通俗理解)***相当于安卓机器的操作系统,类似与windows操作系统,其也 ...
- Android EventBus
Android EventBus 1.Eventbus工作流程 2.导入EventBus库 implementation 'org.greenrobot:eventbus:3.1.1' 3.角色分配 ...
- 微信扫一扫 Android 与 IOS 小区别
wx.scanQRCode({ needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果, scanType: ["qrCode","bar ...
- Android EventBus使用与思路总结
首先说说为什么要用它: 平常开发中免不了要进行各种aci或frgm之间的通信,其实aci之间相对还好,必竟可以通过intent方式,也不会觉得耦合性太强,但frgm之间就麻烦了,除了设置各种接口lis ...
- android eventbus使用,EventBus使用之基础
开源项目链接 背景介绍 如果你学习过设计模式,那么当想通知其他组件某些事情发生时你一定会使用观察者模式.好了,既然能想到这个设计模式,那么就来看一个屌爆天的Android开源框架EventBus.主要 ...
最新文章
- OSChina 周一乱弹 —— 六天颓废一天看剧
- python怎么设置图的大小_python – 如何调整seaborn中的子图大小?
- 手游引擎Unity和Cocos各有什么优劣?
- (33)FPGA分频设计-偶数分频(第7天)
- application实现网页计数_利用百度ai实现文本和图片审核
- Android Shape工具 Duck
- java bfs dfs_java优先搜索(DFS/BFS)实际应用
- 自学python能找到工作吗-自学 Python,我是如何找到工作的?
- 信号与信息处理专业属于计算机类吗,信号与信息处理
- FusionChartsFree的JSP标签开发
- 【vue/iview】将所选择的文本插入文本框的光标处
- 正确认识和使用鲁班尺
- 蓝桥杯五4史丰收速算
- 移动端 网易云 左右滚动导航栏
- 传手机ODM厂商拿到三星大单 将带动产业链走出寒冬?
- 值得收藏-装修攻略全
- android hal单元测试,用于HAL测试的参数化gtest
- 最新花椒回放下载方法-马赛克视频助手
- 若泽数据公开课-JVM01
- 12306 Tickets自动化购票软件操作说明与获取
热门文章
- C#连接mysql实例
- 使用IdleTest进行TDD单元测试驱动开发演练(3) 之 ASP.NET MVC
- .Net之路(四)利用DataTable、DataSet返回SQL Server的表或者单个字段
- [转载] 中华典故故事(孙刚)——01 天要下雨_娘要嫁人
- Winfrom 中如何实现combox 的列表自动显示ToolTip提示
- delphi 标题栏相关操作
- WPF案例 (五) 对控件界面使用倒影
- 微软中国望京新办公楼一游(下)
- 从零基础入门Tensorflow2.0 ----四、16.tfrecord基础API使用
- android andbase,andbase