EventBus事件处理总线

写在前头

 EventBus 是一个事件处理总线,可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。它比广播的使用更为简便,且广播的效率并不高。

 

EventBus

 

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

mainActivity

 

 

(2)在第二个activity发送消息

secondActivity

 

 

(3)在第一个activity中接收到了第二个activity回传的消息

ReciverMessage

 

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值