进行数据的传递,其实与其导入一个这么大的地三方框架,还不如使用接口来的轻便。EventBus是一个事件发布和订阅的框架。
使用的步骤原理方式是:
1、Android studio导入:compile'org.greenrobot:eventbus:3.0.0'
2、定义事件类型:
- public class MessageEvent {
- public final String message;
-
- public MessageEvent(String message) {
- this.message = message;
- }
- }
3、订阅者:
- @Subscribe
- public void onMessageEvent(MessageEvent event){
- Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
- }
- @Subscribe
- public void handleSomethingElse(SomeOtherEvent event){
- doSomethingWith(event);
- }
4、注册及解绑EventBus
- @Override
- public void onStart() {
- super.onStart();
- EventBus.getDefault().register(this);
- }
-
- @Override
- public void onStop() {
- EventBus.getDefault().unregister(this);
- super.onStop();
- }
5、发送事件
- EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
OK,这就是EventBus的简单用法。对于上述代码,需要注意的是:发送事件的类中不需要进行
注册及解绑EventBus,但在订阅者所在的类中则需要进行注册及解绑EventBus。EventBus中事件的发送及订阅是通过事件类型,即本例中的MessageEvent,进行匹配的。
详细讲解:
EventBus包含4个ThreadMode:ThreadMode.POSTING、ThreadMode.MAIN、ThreadMode.BACKGROUND、ThreadMode.ASYNC
例:
- @Subscribe(threadMode = ThreadMode.POSTING)
- public void onMessage(MessageEvent event) {
- log(event.message);
- }
ThreadMode.POSTING:默认使用该模式,表示该方法会在当前发布事件的线程执行
ThreadMode.MAIN:表示会在UI线程中执行
ThreadMode.BACKGROUND:若当前线程非UI线程则在当前线程中执行,否则加入后台任务队列,使用线程池调用
ThreadMode.ASYNC:加入后台任务队列,使用线程池调用
Sticky Events的用法
简单来说,若之前事件使用postSticky进行发布且执行过,则当sticky为true的订阅者再次订阅时,会去stickyEvents去查找事件,然后立即去post执行。
例:
- EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
- @Subscribe(sticky = true)
- public void onEvent(MessageEvent event) {
- textField.setText(event.message);
- }
若必要也可以移除之前发布过的
postSticky,例:
- MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
-
- if(stickyEvent != null) {
- EventBus.getDefault().removeStickyEvent(stickyEvent);
- }
Subscriber Priorities(优先级)
这个没什么好说的,只需要知道优先级越高越优先执行,默认的优先级为0,使用例:
- @Subscribe(priority = 1);
- public void onEvent(MessageEvent event) {
- …
- }
到这就学完了。
http://blog.csdn.net/wl1769127285/article/details/51065015