Android消息传递EventBus的使用

好久没更新博客了,思来想去,时隔半年又重新了回来了 最近项目更新想用下greenrobot的eventbus,之前都是传统的Intent,Handler,Broadcast...... eventbus出现的很早,只是咱们的项目还木有用上,今天就来看看这个吧
  • 官方Eventbus
    官方文档
  • 啥是EventBus?
    EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法。特点是代码简洁,是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式。
  • 下载jar包或者直接Androidstudio里面引用
    库地址
build.gradle添加引用
compile 'org.greenrobot:eventbus:3.0.0'
  • 官方图解


    Android消息传递EventBus的使用_第1张图片

    EventBus

  • EventBus 角色介绍
 Event        传递的事件对象
 Subscriber   事件的订阅者 
 Publisher    事件的发布者
 ThreadMode   定义函数在何种线程中执行
  1. 定义一个事件类型
public class MsgEvent1 {
        private String msg;
        
        public MsgEvent1(String msg) {
                super();
                this.msg = msg;
        }

        public String getMsg() {
                return msg;
        }
}
  • 订阅者
@Subscribe  
public void onMessageEvent(MessageEvent event){  
    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();  
}  
@Subscribe  
public void handleSomethingElse(SomeOtherEvent event){  
    doSomethingWith(event);  
} 
  • 注册和解绑EventBus,发送
@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      EventBus.getDefault().register(this);  
}  
@Override
protected void onDestroy() {
      super.onStop();  
      EventBus.getDefault().unregister(this);  
}  
发送事件
EventBus.getDefault().post(new MessageEvent("Hello EventBus!"));  
EventBus中事件的发送及订阅是通过事件类型,就是上面定义的MessageEvent,由他进行匹配
  • EventBus四种线程模式

ThreadMode.POSTING ThreadMode.MAIN ThreadMode.BACKGROUND ThreadMode.ASYNC

  1. 默认模式
@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执行。

eg:
EventBus.getDefault().postSticky(new MessageEvent("Hello EventBus"));  

@Subscribe(sticky = true)  
    public void onEvent(MessageEvent event) {  
        textField.setText(event.message);  
    } 

如果使用也可以移除之前发布过的postSticky
eg:
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);  
// Better check that an event was actually posted before  
if(stickyEvent != null) {  
    EventBus.getDefault().removeStickyEvent(stickyEvent);  
} 

Subscriber Priorities(优先级)
优先级越高越优先执行,默认的优先级为0,priority 设置优先级别,整数,数值越大优先级别越高,则能优先收到订阅消息

      @Subscribe(threadMode = ThreadMode.PostThread,priority = 1)
      @Subscribe(threadMode = ThreadMode.MainThread,priority = 2)
      @Subscribe(threadMode = ThreadMode.BackgroundThread,priority = 3)
      @Subscribe(threadMode = ThreadMode.Async,priority = 4)    

register的函数重载中有一个可以指定订阅者的优先级,我们知道EventBus中有一个事件类型到List的映射,在这个映射中,所有的Subscription是按priority排序的,这样当post事件时,优先级高的会先得到机会处理事件。

优先级的一个应用就事,高优先级的事件处理函数可以终于事件的传递,通过cancelEventDelivery方法,但有一点需要注意,这个事件的ThreadMode必须是PostThread,并且只能终于它在处理的事件。

  1. 缺点
    无法进程间通信,如果一个应用内有多个进程的话就没办法了

  2. 注意事项及要点

同一个onEvent函数不能被注册两次,所以不能在一个类中注册同时还在父类中注册
当Post一个事件时,这个事件类的父类的事件也会被Post。
Post的事件无Subscriber处理时会Post NoSubscriberEvent事件,当调用Subscriber失败时会Post SubscriberExceptionEvent事件。

@Subscribe(priority = 1);  
public void onEvent(MessageEvent event) {  
    //逻辑处理
}  

EventBus中还有个Util包,主要作用是可以通过AsyncExecutor执行一个Runnable,通过内部的RunnableEx(可以搜索异常的Runnable)当Runnable抛出异常时通过EventBus发消息显示错误对话框

你可能感兴趣的:(Android消息传递EventBus的使用)