写在前头
EventBus 是一个事件处理总线,可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。它比广播的使用更为简便,且广播的效率并不高。
EventBus的优势
- 简化了组件间的通讯
- 分离了事件的发送者和接受者
- 在Activity、Fragment和线程中表现良好
- 避免了复杂的和易错的依赖关系和生命周期问题
- 使得代码更简洁,性能更好
Eventbus接受消息的四种ThreadMode
- POSTING(默认方式) 该方式会使处理消息的函数在与发送消息相同的线程执行,如果发送消息在主线程中,这消息的接收也会在主线程中,如果发送消息在子线程中,这消息的接收也会在子线程中。
- Main 消息的接收在主线程中被执行(应避免耗时操作)。
- BACKGROUND 如果发送消息在主线程中则开辟一个新的线程来执行,否则直接在发送消息的子线程中执行。
- ASYNC 直接开辟一个新的线程来执行消息的接收(该方法不可以操作UI更新)。
Eventbus使用详解
一、EventBus主要有下面两种事件
- 普通事件处理(非粘性事件): 必须在创建接收消息方法后,发送的消息才会被接收
- 粘性事件处理 : 即使在发送消息后才创建接收消息方法依然能够接收得到
二、EventBus使用步骤
- 订阅消息
- 创建消息类
- 发送消息
- 创建消息接收方法
- 接收到消息
三、普通事件处理(非粘性事件)
(1)添加依赖
compile 'org.greenrobot:eventbus:3.0.0'
(2)在需要订阅的类中注册EventBus
//注册EventBus
EventBus.getDefault().register(this);
(3)创建一个消息类(用于传递)
public class MyEvent {
private String msg;
public MyEvent(String msg)
{
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
(4)发送消息
//发送消息
EventBus.getDefault().post(new MyEvent("从SecondActivity回传消息到MainActivity"));
(5)在订阅类中接收消息
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MyEvent event)
{
mTextView.setText(event.getMsg());
}
(6)使用完毕或者生命周期结束时解绑EventBus
//取消绑定
EventBus.getDefault().unregister(this);
四、粘性事件处理
粘性事件:即消息已经发送以后再订阅,依然可以收到消息。(默认状态为非粘性事件)
我们只需要对之前的接受消息代码稍作修改即可
@Subscribe(sticky = true,threadMode = ThreadMode.MAIN)//设置sticky为true就可以处理粘性事件了
public void onEventMainThread(MyEvent event)
{
mTextView.setText(event.getMsg());
}
粘性事件的发送方法
EventBus.getDefault().postSticky(new MyEvent("测试"));
五、事件优先级
我们通过@Subscribe订阅,通过其priority属性来设置接收消息的优先级
@Subscribe(threadMode = ThreadMode.MAIN,priority = 1)
public void onEventMainThread(MyEvent event){
mTextView.setText(event.getMsg());
}
六、拦截事件传递
当消息的模式为ThreadMode.POSTING时消息是可以被拦截的,通过优先级较高的方法拦截消息后,优先级较低的方法将无法在接收到消息即消息将不会再向下传递.
@Subscribe(ThreadMode.POSTING,priority = 1)
public void onEventMainThread(MyEvent event){
mTextView.setText(event.getMsg());
EventBus.getDefault().cancelEventDelivery(event);
}
效果展示
(1)第一个aictivity跳转到第二个activity
(2)在第二个activity发送消息
(3)在第一个activity中接收到了第二个activity回传的消息