一、概述
EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化Android事件传递,事件可以理解为消息。
优点:
调度灵活,使用简单,快速且轻量。不依赖于 Context,使用时无需像广播一样关注 Context 的注入与传递。父类对于通知的监听和处理可以继承给子类。通知的优先级,能够保证 Subscriber 关注最重要的通知。粘滞事件(sticky events)能够保证通知不会因 Subscriber 的不在场而忽略。可继承、优先级、粘滞,是 EventBus 比之于广播、观察者等方式最大的优点,它们使得创建结构良好组织紧密的通知系统成为可能。EventBus 的 Subscriber 注册非常简单,调用 eventBus 对象的 register 方法即可,如果不想创建 eventBus 还可以直接调用静态方法 EventBus.getDefault() 获取默认实例,Subscriber 接收到通知之后的操作放在 onEvent 方法里就行了。成为 Publisher 的过程就更简单了,只需要调用合适的 eventBus(自己创建的或是默认的)的 post 方法即可。作为 github 的明星项目之一, EventBus 的源代码中许多技巧来改善性能;
GitHub地址
源码地址:https://github.com/greenrobot/EventBus/
缺点:
代码逻辑不是很清楚,在 Subscriber 注册的时候,Subscriber 中的方法会被遍历查找以 onEvent 开头的 public 方法。这将带来一些问题,一旦对代码进行混淆,就无法查找到了。好消息是 EventBus 已经打算使用注解来实现,这应该能够解决代码混淆的问题。
但有一个缺点是观察者独有的,那就是观察者可能会造成接口的膨胀。特别是当程序要求大量形式各异的通知,而程序员有没有做出良好的抽象时,代码中会包含大量的接口,接口数量的增长又会带来命名、注释等等一大堆问题。本质上说观察者要求程序员从零开始实现事件的产生、分发与处理过程,这就要求参与者必须对整个通知过程有着良好的理解。当程序代码适量时,这是一个合理的要求,然而当程序太大时,这将成为一种负担。
二、基本使用
1.在gradle添加依赖
compile ‘org.greenrobot:eventbus:3.0.0’
2.自定义一个事件类
public class BaseObjectEvent {}
3.准备subcriber(订阅)的回调method,来处理post event,用注解@Subscribe来定义subscriber的回调method,方法名可以任意定义。
@Subscribe(threadMode = ThreadMode.MAIN)
public void onBaseObjectEvent(BaseObjectEvent event) {};
注册与反注册subcriber(订阅)一般都是在onCreate()和onDestory()注册与反注册
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onDestory() {
super.onDestory();
EventBus.getDefault().unregister(this);
}
(3).post事件
EventBus.getDefault().post(new BaseObjectEvent());
三:接收函数
EventBus有4个不同的函数
1、onEvent
2、onEventMainThread
3、onEventBackgroundThread
4、onEventAsync
onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.
四:实例
下面我们来实现一个具体的例子来介绍EventBus的基本使用。
事件类Event:
/**
* desc: 1、定义一个消息类
*/
public class BaseObjectEvent {
public static final int ERROR_RESPONSE = -1000;
public static final int ADD_FRIEND = 10001;
public static final int GET_MESSAGE_LIST = 10002;
public static final int AGREE_FRIEND = 10003;
public static final int NOTICE_AGREE_FRIEND = 10004;
public static final int CREATE_GROUP_NAME = 10005;
public static final int NOTICE_GROUP_NAME = 10006;
public static final int ADD_GROUP_MEMBER = 10007;
public static final int DEL_GROUP_MEMBER = 10008;
public static final int ADD_DISCUSS_GROUP = 10009;
public static final int ERROR_ADD_DISCUSS_GROUP = -10009;
public static final int NOTICE_DISCUSS_GROUP_NAME = 10010;
public static final int EXIT_DISCUSS_GROUP = 10011;//退出讨论组
public static final int Add_DISCUSS_GROUP = 10012;//拉人进讨论组
public static final int QR_SCAN = 10013;//扫描二维码
public static final int QR_ADD_FRIEND_SCAN = 10014;//扫描二维码添加好友
public static final int QR_GET_FRIEND_INFO = 10015;//扫描二维码获取好友信息
public static final int DEL_FRIEND = 10016;
public static final int DEL_FRIEND_USER_PROFILEACTIVITY_NOTICE = 10017;//UserProfileActivity个人信息界面删除通知通讯录界面刷新
public static final int SET_LAST_MESSAGE_READED = 10018;
public static final int SET_LAST_MESSAGE_READED_BY_CONVERSATION_ID = 10019;
public static final int LeaveGroup_Response_VALUE = 268435476;
public static final int RemoveGroup_Response_VALUE = 268435467;
public static final int Kick_Event_VALUE = 1073741825;
public static final int GetOrg_Response_VALUE = 268435477;
public int type;
public Object data;
public BaseObjectEvent(int type, Object data) {
this.type = type;
this.data = data;
}
@Override
public String toString() {
return "BaseObjectEvent{" +
"type=" + type +
", data=" + data +
'}';
}
}
AActivity中在OnCreate()函数中注册EventBus,在OnDestroy()函数中反注册。
/**
* desc: EventBus的使用总结
*/
public class AActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
//注册
EventBus.getDefault().register(this);
}
/**
* 事件响应方法
* 接收消息
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onBaseEvent(final BaseObjectEvent event) {
LogUtil.e("onBaseEvent = " + event.toString());
//当多个地方使用的时候用type区分 根据自己项目需求而定
switch (event.type) {
case ADD_FRIEND: {//对方添加好友
break;
}
case AGREE_FRIEND: //同意添加好友
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//反注册
EventBus.getDefault().unregister(this);
}
}
BActivity中post事件:
public class BActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
String message = "Hello,World!";
EventBus.getDefault().post(new BaseObjectEvent(ADD_FRIEND, message));//告诉EventBus的世界你来了
}
}).start();
}
});
}
}