EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发。
Gihub地址 :https://github.com/greenrobot/EventBus。
EventBus能够简化各组件间的通信,让我们的代码书写变得简单,能有效的分离事件发送方和接收方(也就是解耦的意思),能避免复杂和容易出错的依赖性和生命周期问题。EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment、Activity、Service线程之间传递数据,执行方法。
特点:代码简洁,是一种发布订阅设计模式(观察者设计模式)。
参考链接:
https://baike.baidu.com/item/EventBus/20461274
https://www.jianshu.com/p/e7d5c7bda783
https://www.jianshu.com/p/f9ae5691e1bb
三大角色:
Event:事件,可以是任意类型,EventBus会根据事件类型进行全局的通知。
Subscriber:事件订阅者,在EventBus 3.0之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subscribe,并且指定线程模型,默认是POSTING。
Publisher:事件的发布者,可以在任意线程里发布事件。一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。
四个线程模型
①POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
②MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
③BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
④ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
参考链接:https://blog.csdn.net/ezconn/article/details/84034642
添加依赖库
compile 'org.greenrobot:eventbus:3.1.1'
1.注册、注销事件。注册后必须注销。一般在Activity或Fragment的onCreate()方法里去注册EventBus,在onDestory()方法里,去解除注册
if (!EventBus.getDefault().isRegistered(this))
EventBus.getDefault().register(this); //注册事件,不可重复注册
if (EventBus.getDefault().isRegistered(this))
EventBus.getDefault().unregister(this); //注销事件
注册一般是在 onCreate() 和 onStart() 里,尽量不要在onResume(),可能出现多次注册的情况, 注册时最好放到各变量初始化最后。注销一般在onDestory()方法里。
2.新建EventMessage类,作为程序间的通信对象。
EventMessage.java
3.发送消息
EventBus.getDefault().post(new EventMessage(1, "2222eventBus上线啦~~"));
4.接收消息。接收消息的方法必须是public,方法名可随意命名,但必须加注解@Subscribe,并指定线程模型。
@Subscribe(threadMode = ThreadMode.MAIN)
public void getEventMessage(EventMessage eMsg) {
if (eMsg.getType() == 1) showData2.setText(eMsg.getMessage());
}
5.粘性事件
粘性事件的发送
EventBus.getDefault().postSticky(new EventMessage(2, "11111发来粘性事件~"));
粘性事件的接收
@Subscribe(threadMode = ThreadMode.BACKGROUND, sticky = true)
public void getEventMessage(EventMessage eMsg) {
if (eMsg.getType() == 2) showData2.setText(eMsg.getMessage());
}
注意:粘性事件主要为了解决作为接收端没有在事件发出前注册事件而导致的接收端接收不到的问题。因此粘性事件可以忽略注册在事件发出前后的问题,在注册事件完成后就可以接收到事件,只需在接收方法的注解增加sticky = true,值得注意的是,将线程模型设为main或posting时还是接收不到发送来的事件,需要把threadMode = ThreadMode.BACKGROUND或async。
6.如何区别接收不同事件?
可以通过不同的类,或者像上述例子一样判断接收消息的type。
7.事件接收不到的原因?
①事件没有注册,就开始发送事件,导致接收不到,用粘性事件postSticky;
②事件的消息类型不能是基本数据类型,必须是String或对象。
8.优先级 参考链接:https://www.jianshu.com/p/e7d5c7bda783
priority,用来指定订阅方法的优先级,整数类型,默认为0,值越大表示优先级越高。在某个事件被发布出来的时候,优先级较高的订阅方法会首先接受到事件。
注意:只有当两个订阅方法使用相同的ThreadMode参数的时候,它们的优先级才会与priority指定的值一致;只有当某个订阅方法的ThreadMode参数为POSTING的时候,它才能停止该事件的继续分发。
其他使用疑惑参考链接:https://juejin.im/entry/5a4706e5518825519408f3ca
每天进步一点点(190519)
上一篇:OKHttp LoggingInterceptor的使用:https://www.jianshu.com/p/53a9125d610d
我的更多学习分享:https://www.jianshu.com/u/57ab9a74e2c0
网友评论