EventBus3 笔记

eventbus是安卓开发中常用的消息传递工具,能够有效对发送方与接收方解耦合。

配置eventbus

在build.gradle中,在依赖中添加:

implementation 'org.greenrobot:eventbus:3.1.1'

普通消息实现 

普通消息的特点是,消息发送时若无接收方进行接受,则此消息作废。

消息类型

消息类型通常由自定义的类实现:

public class Message {
    private String name;
    private int age;

    public Message(String name,int age){
        this.name = name;
        this.age = age;
    }

    public String getName(){
        return this.name;
    }

    public int getAge(){
        return this.age;
    }

    public void setName(String name){
        this.name = name;
    }

    public void setAge(int age){
        this.age = age;
    }
}

该消息类型中包含两个数据,一个是名字,一个是年龄。

消息发送

EventBus.getDefault().post(new Message("kuaile",22));

EventBus.getDefault()获得eventbus的一个实例,该类是一个单例模式。

我们实现一个信息对象,并为其成员变量赋值,该对象就是我们要传递的信息。

信息接受

信息接收方需要进行注册信息接受,并且在退出后解除注册。

//注册eventbus
EventBus.getDefault().register(this);
 //  解除注册eventbus
    @Override
    protected void onDestroy(){
        super.onDestroy();
        if (EventBus.getDefault().isRegistered(this)){
            EventBus.getDefault().unregister(this);
        }
    }

注册内容实现后需要实现信息的接收:


    @Subscribe(threadMode = ThreadMode.POSTING)
    public void onEvent(Message message){
        if(message != null){
            Toast.makeText(this,"name "+message.getName()+" age "+message.getAge(),Toast.LENGTH_SHORT).show();
        }
    }

在接收函数中要实例化一个消息类型的对象,并同时读取消息。

粘性消息实现

粘性消息的特点是,即便消息已经发送出去,也就是经过了发信息的时间点,之后注册的接收方照样可以接受到此信息。

信息发送

EventBus.getDefault().postSticky(new Message("huankuai",21));

信息注册

信息注册的内容与普通信息完全一样。

信息接收

    @Subscribe(threadMode = ThreadMode.POSTING,sticky = true)
    public void onEvent(Message message){
        if(message != null){
            Toast.makeText(this,"name "+message.getName()+" age "+message.getAge(),Toast.LENGTH_SHORT).show();
        }
    }

粘性信息的接收函数仅比普通消息多一个参数。

ThreadMode

posting:发布事件与接收事件在一个线程中,应尽量避免耗时操作,否则容易阻塞事件传递。

main:事件的处理在主线程中进行。

background:如果事件从主线程中发布,则在子线程中处理事件;如果事件从子线程发布,则在该子线程中处理。

async:无论事件从哪个线程发布,都要创建一个新线程处理事件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 中的事件总线 (EventBus) 并不像 Vue 2 中那样直接可用。但是,你仍然可以创建一个类似的全局事件总线,并在应用程序的不同组件之间进行通信。 一种常见的方法是通过创建一个单独的 Vue 实例来实现事件总线。你可以在应用程序的入口文件中创建该实例,并将其导出以供其他组件使用。 下面是一个示例代码,展示了如何在 Vue 3 中实现一个简单的事件总线: ```javascript // event-bus.js import { createApp } from 'vue'; const app = createApp({}); const eventBus = app.config.globalProperties.$eventBus = app.mount('#app'); export default eventBus; ``` 在上面的代码中,我们先创建了一个空的 Vue 应用程序实例 `app`,然后将其作为事件总线 `eventBus` 导出。我们通过 `app.config.globalProperties` 将 `eventBus` 注册为全局属性,这样我们就可以在任何组件中使用它。 然后,在你想要使用事件总线的组件中,你可以通过 `this.$eventBus` 访问该实例,并使用它来发送和接收事件: ```javascript // ComponentA.vue export default { mounted() { this.$eventBus.$emit('eventName', data); } } ``` ```javascript // ComponentB.vue export default { created() { this.$eventBus.$on('eventName', this.handleEvent); }, methods: { handleEvent(data) { // 处理事件数据 } } } ``` 通过上述代码,`ComponentA` 可以通过 `$emit` 方法触发名为 `'eventName'` 的事件,并传递数据。而 `ComponentB` 则通过 `$on` 方法监听该事件,并在事件发生时执行相应的处理函数 `handleEvent`。 这样,你就可以在 Vue 3 中实现一个类似于 Vue 2 中的事件总线。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值