一、简介
标准解释:Android optimized event bus that simplifies communication between Activities,Fragments, Threads, Services, etc. Less code, better quality.
瞎翻译:简化Activity、Fragment、Thread、Service间通信的Android优化事件总线,不仅代码量不大,而且效率很高。
事件总线:基于观察者模式的事件发布/订阅框架。类似框架还有otto ,EventBus官网在这里 、GitHub网址在这里 ,详细介绍还是移步官网(英文版,一脸懵逼ing。。。),好啦,官图解释如下:
二、应用
1、添加依赖
当然是在module下的gradle文件中了,哈哈!
compile'org.greenrobot:eventbus:3.0.0'
2、注册与注销
2.1、注册
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
2.2、注销
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unRegister(this);
}
3、事件发送
3.1、普通事件
EventBus.getDefault().post("str");//
3.2、粘性事件
EventBus.getDefault().postSticky("str");//
4、事件接收与处理
4.1、Activity中接收
@Subscribe(threadMode= ThreadMode.MAIN,priority=100)
public void onEventMainActivity(String string) {
Toast.makeText(getApplicationContext(),"主界面收到消息",Toast.LENGTH_LONG).show();
}
4.2、Fragment中接收
@Subscribe(threadMode= ThreadMode.MAIN,sticky=true,priority=100)
public void onEventOnFragment(String message){
textView.setText("点击evnetbus之后");
}
5、效果
5.1、发送消息之前
5.2、发送消息之后
6、其他
6.1、注解参数
6.1.1、线程模式
(1)postThread:用户将被调用在同一个线程中,这是发布事件(这是默认值)。事件传递意昧着最少的开销,因为它完全避免了线程切换。因此,这是推荐的模式,来处理简单的任务,如果是已知的完成是一个很短的时间,而不需要主线程。事件处理使用此模式必须迅速返回,以避免阻塞发布线程,这可能是主线程。
(2)MainThread:用户将被调用在主线程(UI线程)。如果发布线程是主线程,事件处理程序方法将直接调用。使用此模式的事件处理程序必须快速返回,避免阻塞主线程。
(3)BackgrounThread:将在后台线程中调用订阅者。如果发布线程不是主线程,则事件处理程序方法将被在发布线程中直接调用。如果线程是主线程,eventbus采用单独的一个后台线程,将按顺序调用所有的事件。使用此模式的事件处理程序应尝试快速返回,以避免阻塞后台线程。
(4)Async:事件处理程序方法在一个单独的线程中调用。这总是独立于发布线程和主线程。发布事件从来不会等待使用这种模式的事件处理程序方法。事件处理程序方法使用此模式,如果他们的执行可能需要一段时间,例如用于网络访问。避免触发大量在同一时间运行长时间运行的异步处理程序方法以限制并发线程的数目。eventbus使用一个线程池来有效地重用已完成的异步事件处理程序通知的线程。
threadMode= ThreadMode.MAIN,//指运行的线程:postThread、MainThread、BackgrounThread、Async
6.1.2、是否接收粘性事件
sticky=true,//是否接收粘性事件
6.1.3、优先级
优先级,如果同时存在多个观察者(threadMode相同),我们是不是可以通过优先级的设定,来决定哪一个观察者获得事件或者消息的顺序,这样就更加灵活了
priority=100//
6.2、粘性与非粘性的区别
粘性事件是指:一些事件进行信息感兴趣的事件后发布。 例如,一个事件信号,一些初始化完成。或者如果你有传感器位置数据和你想抓住最近的值。而不是实现自己的缓存,您可以使用黏性的事件。EventBus保持过去的事件的特定类型在内存中。黏性的事件可以交付给用户或显式查询。因此,你不需要任何特殊的逻辑来考虑可用的数据。粘性事件发布,开始一个新的活动。在注册过程中粘性用户所有方法将立即得到前面贴粘性的事件。
因此两者区别在于接收并处理事件的类是否创建,如若创建,两种事件均可以,如若未创建,那么就用粘性事件。
另:本人水平有限,若有不足甚至错误的地方,欢迎批评指正,本人感激不尽。