EventBus全解析

来源:互联网 发布:手机淘宝怎么投诉商家 编辑:程序博客网 时间:2024/06/07 18:20

EvnetBus,简言之,就是一个android的观察者模式的框架,优点是开销小,代码更优雅。以及将发送者和接收者解耦。

以前一直没用过,用来之后,简直停不下来。不管是activity还是fragment,还是各控件、弹框,轻松配置之后,就可以实现事件的发布、订阅。下面以android studio为例简单说一下:

该链接为github上的EventBus的地址:https://github.com/greenrobot/EventBus,上面有说明,有demo。

首先,下载jar包,放到项目libs目录下,选中jar包,右键 add as library,jar包就算导入成功了。

然后就可以使用啦!

(一)被观察者,这里被观察者只需要使用post方法发出事件即可:

EventBus.getDefault().post.(MessageEvent.create(EventName.xxx));

注意其中的MessageEvent和EventName,在这里先打一个TODO标记。

(二)观察者,操作分三步:

1.注册EventBus:EventBus.getDefault().register(this);

   对应的还有取消注册:EventBus.getDefault().unRegister(this);

2.接受被观察者发出的事件:public void onEvent(MessageEvent event) {} 

 (注意这里MessageEvent 再次出现了),注意这里的接受事件方法

 3.对接受到的事件进行判断、处理。



整体体验完之后,解决上面遗留的一些问题:

1.EventName

2.MessageEvent 

3.onEvent

其中,前两个是对EventBus的一些内容的封装,如果项目简单的话,可以不做处理,当然,简单的话也没必要用到EventBus。

第三个是EventBus中的接受事件的方法,有四种,下面一一介绍。

首先说EventName:

public class EventName {    public static final String NETWORK_CHANGED_EVENT = "network_changed_event";    public static final String ECG_DATA_CHANGE = "ecg_data_change";    public static final String BP_MEASURE_CHANGE = "bp_measure_change";    public static final String BP_HANDLE_MEASURE = "bp_handle_measure";    public static final String BP_ALARM_RING= "bp_alarm_ring";    public static final String PHONE_BOOT= "phone_boot";    public static final String SETTING_CHANGE = "setting_change";}

简言之,EventName就是就是对事件名字的封装。


2.MessageEvent :是对EventBus事件创建的封装,

public class MessageEvent {    private String mEventName;    private Object mData;    public static MessageEvent create(String eventName, Object data){        MessageEvent event = new MessageEvent();        event.mEventName = eventName;        event.mData = data;        return event;    }    public static MessageEvent create(String eventName){        return create(eventName,null);    }    public String getEventName() {        return mEventName;    }    public Object getData() {        return mData;    }}

如上面的一个封装实例,当然有很多种封装方法,仅供参考(封装的内容不外呼就是事件的成员,事件的构造方法等,讲事件穿点本事看做对象就好理解了)。


3.onEvent:接受事件的方法,onEvent只是其中的一种方法,而这几种方法的主要区别就是接受事件的执行位置。

a. onEvent: 事件在哪个线程发出,就在哪个线程执行,即事件的发布和接受在同一个线程

注意使用该方法时,不能执行耗时操作(容易导致事件分发延迟)。

b.onEventMainThread:不论事件的发出在哪个线程,事件的接受都在主线程,理所当然的,该方法也不能执行耗时操作

c. onEventBachground:这个比较特别,如果事件的发布在主线程,则时间的接受在子线程中;如果时间的发布在子线程,

则事件的接受在发布事件的子线程。

d.onEventAsync:不论事件的发布在哪个线程,都会创建一个子线程来接受事件。

当然,在EventBus内部,也对事件的接手方法做了枚举类的封装:

public enum ThreadMode {    POSTING,    MAIN,    BACKGROUND,    ASYNC;    private ThreadMode() {    }}

我们在使用的时候可以直接对引用onMessageEvent方法,然后对方法打Subscribe标记,标记里选择线程的执行类型,如下

@Subscribe(threadMode = ThreadMode.MAIN)public void onMessageEvent(MessageEvent event){    if(event.getEventName().equals(EventName.Name1)){        //操作1    }else if(event.getEventName().equals(EventName.Name2)){
//操作2
}else if(event.getEventName().equals(EventName.Name3)){ //操作3 }}

至此,EventBus用法基本介绍完了。

原创粉丝点击