EventBus使用介绍

EventBus介绍

EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,它利用发布/订阅者者模式来对项目进行解耦,它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多不便。工作模式:
在这里插入图片描述
Publisher(发布者)通过post()方法,把Event事件发布出去,Subscriber(订阅者)在onEvent()方法中接收事件。

EventBus使用方式

1.在build.gradle文件中导入EventBus库。

    implementation 'org.greenrobot:eventbus:3.1.1'

比如:我需要在一个Activity里注册EventBus事件,然后定义接收方法,这跟Android里的广播机制很像,你需要首先注册广播,然后需要编写内部类,实现接收广播,然后操作UI。所以,在EventBus中,你同样得这么做。

2.自定义一个事件类

public class MessageEvent{
    private String message;
    public  MessageEvent(String message){
        this.message=message;
    }
    public String getMessage() {
        return message;
    }
 
    public void setMessage(String message) {
        this.message = message;
    }
}

这个类就是一个Bean类,里面定义用来传输的数据的类型。

3.注册事件和取消注册
当我们需要在Activity或者Fragment里订阅事件时,我们需要注册EventBus。我们一般选择在Activity的onCreate()方法里去注册EventBus,在onDestory()方法里,去解除注册。

@Override
protected void onCreate(Bundle savedInstanceState) {           
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main)//注册eventbus
     EventBus.getDefault().register(this)} 


@Override
protected void onDestroy() {
    super.onDestroy();
    // 取消注册
    EventBus.getDefault().unregister(this);
}

4.发送事件

EventBus.getDefault().post(messageEvent);

5.处理事件

@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(MessageEvent messageEvent) {
    ...		//需要触发的事件
}

粘性事件

何为黏性事件呢?简单讲,就是在发送事件之后再订阅该事件也能收到该事件。Android中就有这样的实例,也就是Sticky Broadcast,即粘性广播。正常情况下如果发送者发送了某个广播,而接收者在这个广播发送后才注册自己的Receiver,这时接收者便无法接收到 刚才的广播,为此Android引入了StickyBroadcast,在广播发送结束后会保存刚刚发送的广播(Intent),这样当接收者注册完 Receiver后就可以接收到刚才已经发布的广播。这就使得我们可以预先处理一些事件,让有消费者时再把这些事件投递给消费者.
EventBus也提供了这样的功能,有所不同是EventBus会存储所有的Sticky事件,如果某个事件在不需要再存储则需要手动进行移除。用户通过Sticky的形式发布事件,而消费者也需要通过Sticky的形式进行注册,当然这种注册除了可以接收 Sticky事件之外和常规的注册功能是一样的,其他类型的事件也会被正常处理

粘性事件的使用

粘性事件的发布:

    // 发送粘性事件
                StickyEvent stickyEvent = new StickyEvent();
                stickyEvent.msg = "我是粘性事件";
                EventBus.getDefault().postSticky(stickyEvent);
                // 跳转页面
                startActivity(new Intent(this,Main2Activity.class));

事件的注册和粘性事件的接收

    // 注册粘性事件
    EventBus.getDefault().register(this);
    /**
     * sticky =true  可以接收粘性事件
     * @param stickyEvent
     */
    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
    public void getStickyEvent(StickyEvent stickyEvent){

        mTextView.setText(stickyEvent.msg);
    }

手动获取和移除粘性事件

最近发布的粘性事件在其新订阅者注册后将会自动传递给新订阅者。但有时可能更方便手动检查粘性事件。有时我们也需要移除粘性事件,以免它在传递下去。

MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
if(stickyEvent != null) {
    EventBus.getDefault().removeStickyEvent(stickyEvent);
  //TODO
}

使用场景

我们要把一个Event发送到一个还没有初始化的Activity/Fragment,即尚未订阅事件。那么如果只是简单的post一个事件,那么是无法收到的,这时候,你需要用到粘性事件,它可以帮你解决这类问题.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值