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用法基本介绍完了。
- eventbus全解析
- EventBus用法全解析
- EventBus全解析
- EventBus 解析
- EventBus解析
- EventBus 源码解析
- EventBus 源码解析
- EventBus 源码解析
- EventBus 源码解析
- Android EventBus解析
- EventBus 源码解析(一)
- android EventBus源码解析
- EventBus 源码解析
- EventBus源码解析
- EventBus使用与解析
- Android 源码解析:EventBus
- 源码解析EventBus
- EventBus 源码解析
- mysql中的mysql.user表
- webview长按自由复制文字
- bootstrapTable 修改栏位值
- 如何判断网站是不是wordpress做的及WP主题是什么?
- 解决Session 'appname': Error Launching activity
- EventBus全解析
- 基于IMX6Q的XFM10621六麦驱动实现说明
- android 防快速点击的一种实现方式
- python 基础知识补充
- dentry与inode有什么联系和区别
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- C语言实现bmp图片全彩转灰度,灰度转伪彩
- svg3dtagcloud生成3D标签云
- EventBus 3.0的用法详解