Android EventBus的使用

android EventBus的简单使用 今天,简单讲讲Android里关于EventBus的使用。 这几天,由于面试的缘故,我听到了很多Android的流行框架,但是之前自己在公司做APP时并没有使用,所以没有了解。于是在网上查找了资料,学习了这些Android的流行框架的使用,准备做一个Android流行框架的专栏。分别介绍Android框架:EventBus,RXJava,Retrofit,OKHttp,Dagger2,Butte... 阅读详情

Github地址:https://github.com/greenrobot/EventBus

中文翻译参考:http://blog.youkuaiyun.com/poorkick/article/details/55099311

EventBus简介

EventBus 是一个使用发布者/订阅者模式 并且低耦合的Android开源库。个人理解类似于Android中的观察者模式。详细介绍请看官方文档,本文重点想说明的 红色标记出来了。

来自Github的一张图

 

使用说明

一,添加依赖

implementation 'org.greenrobot:eventbus:3.1.1'

二,注册 / 解除注册 

//注册EventBus事件
EventBus.getDefault().register(this);
//解除注册
EventBus.getDefault().unregister(this);

三,准备消息类

public class MessageEvent {

    private int id;
    private String name;

    public MessageEvent(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

四,发送消息

两种发送消息的方式(普通事件+粘性事件)

        EventBus.getDefault().post(new MessageEvent(1,"test"));
        EventBus.getDefault().postSticky(new MessageEvent(2,"Test"));

五,接收消息

@Subscribe 注解来定义订阅者方法

threadMode 确认线程模式

sticky 是否接受粘性事件

    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void getEventBusMsg(MessageEvent event) {
        switch (event.getId()){
            case 1:
                break;
            case 2:
                break;
        }
    }

 

四种线程模式

 

一,ThreadMode: POSTING

订阅者将会在事件发布的线程中被调用。这是默认模式。事件的传递是同步完成的,一旦事件发布完成,所有的订阅者都将会被调用。由于完全避免了线程切换,这种模式的开销是最小的。所以,针对那些不需要主线程并且能在很短时间内完成的简单任务,我们推荐使用这种模式。这种模式下的事件处理方法必须快速返回,避免阻塞发布事件的线程,因为这个线程有可能是主线程。 

 

二,ThreadMode: MAIN

订阅者将在Android的主线程(有时称为UI线程)中调用。 如果发布线程是主线程,则将直接调用事件处理方法(与ThreadMode.POSTING描述的同步)。 使用此模式的事件处理程序必须快速返回,以避免阻塞主线程。

 

三,ThreadMode: BACKGROUND

订阅者将在后台线程中调用。 如果发布线程不是主线程,事件处理程序方法将直接在发布线程中调用。 如果发布线程是主线程,EventBus使用单个后台线程来按顺序传递所有事件。 使用此模式的事件处理方法应尽快返回以避免阻塞后台线程。 

 

四,ThreadMode: ASYNC

事件处理方法在单独的线程中调用。 这个线程总是独立于发布线程和主线程。 这种模式下,发布事件不会等待事件处理方法的执行结果。 如果事件处理方法的执行需要一些时间,则应该使用此模式,如网络访问。 避免同时触发大量长时间运行的异步处理方法以限制并发线程的数量。 EventBus使用线程池来有效地重用已完成任务的线程。 

 

粘性事件

特点是不需要先订阅,就是在发送事件之后再订阅该事件也能收到该事件。例如已经发送了一个粘性事件,这时候再打开一个新的Activity或者Fragment,并在其中订阅了EventBus的消息,那么这个时候,粘性事件能够收到,而普通事件无法收到。

同一类型(消息类)的粘性事件只会保存一个,如果有多个一起发生,则只会保存最后一个类型的粘性事件

粘性事件的获取跟取消

这里,我有看几篇文章都写得不是很清楚,都是两个方法一起使用,看了下官方文档,总结一下,如有错误,欢迎纠正。

最后一个粘性事件在注册时自动传递给匹配的订阅者,但有时手动检查粘性事件可能会更方便。

        //粘性事件的获取
        MessageEvent event = EventBus.getDefault().getStickyEvent(MessageEvent.class);
        //判断是否存在
        if(null != event){
            //存在,先清除
            EventBus.getDefault().removeStickyEvent(event);
            //do something ...

        }

或者,因为 方法removeStickyEvent是重载的:当你传入类时,它将返回先前持有的粘性事件。所以上面部分可以改进一下,当然用上面的方式,也完全没有问题

        //粘性事件的获取
        MessageEvent removeEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);
        //判断是否存在
        if(null != removeEvent){
            //do something ...

        }

优先级

Subscribe注解可以使用priority进行修饰,同一分派事件中,优先级越高,订阅方法越先处理。

取消事件分发

    @Subscribe(threadMode = ThreadMode.MAIN, priority = 1)
    public void getEventBusMsg(MessageEvent event) {

        EventBus.getDefault().cancelEventDelivery(event);


    }

这里可以做一种类似 Android事件分发,可以使用设置优先级+取消事件分发,实现一个事件拦截。当然拦截后不会反向向上传递,只是拦截并处理掉该事件,结束。

 

 

数电实训:万年历 万年历 阅读详情

相关推荐

论文学习:Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline

title: “Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline” tags: [“论文评述”, “报告”] date: 2019-08-22 author: 叶慧 mathjax: true 论文:Towards Automated Infograph...

xiaoyehahaha的博客 731

EventBus之粘性事件(Sticky Events)

Sticky Events 有些事件在事件发布后携带有感兴趣的信息。例如,一个事件表示某个初始化已经完成。或者如果你有一些传感器或位置数据,你想要保持最近的值。您可以使用粘性事件,而不是实现自己的缓存。因此EventBus将某个类型的最后一个粘性事件保存在内存中。然后可以将粘性事件交付给订阅者或显式查询。因此,您不需要任何特殊的逻辑来考虑已经可用的数据。 示例: 可以在订阅都订阅之前,首先发...

WindfallSheng的博客 5248

基于CubeMX与lwip的STM32轻量级HTTP服务器搭建及VSCode高效开发指南

本文详细介绍了如何在STM32单片机上,利用STM32CubeMX图形化配置工具和轻量级TCP/IP协议栈lwIP,快速搭建一个轻量级HTTP服务器。通过结合VSCode的高效代码编辑能力,提供了一套从硬件连接到动态网页交互(SSI/CGI)的完整开发指南,旨在为嵌入式设备提供零成本、跨平台的Web交互界面。

weixin_29163857的博客 582

EventBus主页面发送消息其他页面接收消息

今天心血来潮 怀着激动的心情来给码友们甩一个小博客!! 概念、优点等什么的我就不说了网上一箩筐 废话不说了 直接甩代码 1.导入依赖 compile 'org.greenrobot:eventbus:3.0.0' 主页面发送消息: public class MainActivity extends AppC...

wl1433289703的博客 2018

2025年12月11日 Coherent收发器下沉到数据中心:调研

技术可行性已基本具备。随着3nm DSP技术的成熟和Coherent-Lite等低功耗方案的推出,Coherent技术与IMDD的功耗差距在800G及以上速率节点快速缩小。特别是在1.6T及更高速率,两种技术的功耗开始趋于收敛。同时,通过系统级优化,如将DSP功能从可插拔模块转移到ASIC芯片,可实现30%以上的功耗降低。在成本方面,硅光技术的进步使得单通道硅光引擎BOM成本降至18美元,较2020年下降62%,逼近InP方案的经济临界点。光学系统机会丰富多样。

weixin_51184047的博客 1167

时序SDC约束set_data_check及常见应用场景

时序约束SDC之set_data_check命令及常见应用场景解析

weixin_37584728的博客 2286

Android EventBus Sticky Events粘性事件详解

简介 普通事件:通过post()方法发出的普通事件,会被已经注册的订阅者接收到,若订阅者是在消息发送之后才注册,那么是不会接收到该事件的 粘性事件:而粘性事件是可以被事件发出之后才注册的订阅者接收到,也可以在事件发出之后通过主动查询获取事件内容。粘性事件实现原理其实是把最近的事件缓存到内存中,之后注册的订阅者还可以查询出来 比如在AActivity中发送一个粘性事件Event,然后打开BAc...

野猿新一 5978

2025.06.06【Ribo-seq】|RiboCode:基于Ribo-seq数据的全基因组翻译ORF检测工具详解与实战流程

大家好!今天我们要学习的是RiboCode——一个专为Ribo-seq(核糖体足迹测序)数据设计的高质量翻译ORF(开放阅读框)检测工具。RiboCode能够帮助我们在全基因组范围内精准识别翻译事件,发掘经典CDS之外的uORF、dORF、重叠ORF等新型翻译本,极大拓展了我们对转录本翻译潜能的认知。RiboCode 是由清华大学杨学睿课题组开发的开源软件,支持Linux/Mac平台,采用Python实现。自动化流程:一条命令即可完成注释准备、P-site定位、ORF预测。高灵敏度与特异性。

1854

EventBus的StickyEvents黏性事件详解及使用说明

EventBus还支持发送黏性事件。何为黏性事件呢?简单讲,就是在发送事件之后再订阅该事件也能收到该事件,跟黏性广播类似。 看看官网的描述 Some events carry information that is of interest after the event is posted. For example, an event signals that some ini

丶ban 1万+

【四足机器人实战】四足机器人运动学、动力学模型

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!四足机器人的运动学和动力学模型是其设计和控制的基础,涉及到如何精确描述和预测机器人在不同条件下的运动状态和行为本文先对四足机器人运动学、动力学模型做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章运动学模型主要关注四足机器人的几何形态和时间序列下的运动特性,而动力学模型则进一步考虑了引起这些运动的力和扭矩的作用效果。运动学模型:运动学模型描述了四足机器人在没有考虑力的影响下的运动特性。

qq_35635374的博客 1055

API深度集成——OpenClaw与第三方服务无缝对接(2026实战版)

本文介绍了OpenClaw系统与第三方服务的API深度集成技术,重点阐述了RESTful API的实现方案。通过一个功能完善的REST客户端类(RestClient)展示了核心功能:支持请求重试、拦截器机制、错误处理和认证管理等;同时提供了API资源管理器(ApiResourceManager)简化资源操作。这些技术实现了OpenClaw与外部系统的稳定可靠对接,为开发者构建API集成方案提供了2026年的最佳实践。

博客 1213

Android EventBus 的使用

1、EventBus 简介 EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,Gihub地址是:EventBus。它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多不便。 1.1 三个角色 Event:事件,它可以是任意类型,EventBus会根据事件类型进行全局的通知。 Subscri...

guodashen007的博客 692

YOLOv11改进 | Conv/卷积篇 | 轻量化多尺度异构卷积(MSHC)优化YOLOv11精度(全网独家首发)

本文介绍了Hype-YOLO提出的MANet结构,这是C3、C2f、C3k2的升级版,能显著增强特征提取能力。MANet整合了DSConv和C2f结构,通过多分支异构设计提升梯度流动和特征语义深度。文章详细解析了MSHC模块的原理,包括其多尺度并行建模、通道混洗等核心机制,并提供了完整的代码实现和训练教程。实验表明,Hype-YOLO的精度优于YOLOv11。该结构在保持轻量化的同时,通过异构分支设计实现了更丰富的特征表达,适用于目标检测等视觉任务。

Snu77的博客 948

安卓Eventbus的使用

EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,使用简单,代码简洁,下面将介绍如果集成使用。 第一步添加依赖: implementation 'org.greenrobot:eventbus:3.0.0' 第二步注册: onCreate方法中注册 if (!EventBu...

qq_36356379的博客 1702

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

安卓EventBus使用方法,eventbus举例

原帖: 跳转 1、EventBus 简介 EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,Gihub地址是:EventBus。它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多不便。 1.1 三个角色 Event:事件,它可以是任意类型,EventBus会根据事件类型进行全局的通知。 Subscriber:事件订阅者,在EventBus 3.0之前我们必须定义以onEvent开头的那几个方法,分别

ruiruiddd的博客 2304

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【Android】EventBus 的使用

Android 事件总线 EventBus 的使用

LiuYaoheng的博客 1202

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

安卓开发之EventBus使用

学完GreenDao之后再来学习下EventBus的使用,EventBus 是一个Android事件发布/订阅框架,它利用发布/订阅者者模式来对项目进行解耦,可以利用很少的代码,来实现多组件间通信/Android的组件间通信。 之前我们学习过一些传统的事件传递方式例如Handler、BroadcastReceiver等,相比之下EventBus代码简洁,使用简单,并将事件发布和订阅充分解耦。BroadcastReceiver常用于那些要与Android系统打交道的事件例如网络、电量的变化等;在Broadca

iris的博客 2172

Android中EventBus的简单使用

Android系统内置的事件通讯存在缺点:Android系统中的事件通信则是 handler (消息机制) 和 BroadCastReceiver (广播机制), 通过它们可以实现组件之间的事件通讯。缺点在于,代码量多、组件之易产生藕合引用。

Sean_Word的博客 2400

Android框架EventBus的使用

在写代码的时候,有时候在类与类之间进行通信不太方便,自己就用到了EventBus。 EventBus主要用于应用程序内各组件间、组件与后台线程间的通信。 //第一步需要添加依赖 implementation 'org.greenrobot:eventbus:3.0.0' //在获取返回信息的Activity.java中的onCreate进行注册 EventBus.getDefault().reg...

weixin_44059750的博客 1257

【Android】EventBus的使用

EventBus是一个用于简化组件间通信的开源库,它使用`发布-订阅`模式(Pub-Sub)来实现事件的传递。在Android开发中,不同的组件(例如Activity、Fragment、Service等)之间可能需要进行通信,例如一个组件发送一个事件,而其他组件可以订阅并接收该事件。这种通信方式可以帮助组件之间解耦,使代码更加清晰和可维护。

xoliu的博客 1653

Android框架之路——EventBus的使用

一、简介 EventBus是由greenrobot 组织贡献的一个Android事件发布/订阅轻量级框架。EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过Even

等一杯咖啡的博客 3万+

android 广播 eventbus,Android EventBus 的使用

2559b11d3220e9fc9ee87f8248419e74b7eb3ce1.jpg1、EventBus 简介EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,Gihub地址是:EventBus。它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多不便。1.1 三个角色Event:事件,它可以...

weixin_29041443的博客 511

Android EventBus使用

使用EventBus来代替Intent、Handler、Broadcast进行模块间通信、模块与后台线程进行通信,避免代码量大时代码高度耦合:1、首先在项目的 build.gradle 文件中的  dependencies下加入如下远程依赖:compile 'org.greenrobot:eventbus:3.1.1'然后点击 Sync Now等待项目build完成即可。    混淆需加入如下代码...

飞天的蜗牛的博客 268

android eventbus管理,Android 浅析 EventBus (一) 使用

Android 浅析EventBus (一) 使用前言Linus Benedict Torvalds : RTFSC – Read The Fucking Source Code概括EventBus is a publish/subscribe event bus optimized for Android.EventBus 是一个为 Android 优化的 publish/subscribe 事...

weixin_36018773的博客 379

Android EventBus 如何使用

Android EventBus 如何使用

qq_36570506的博客 296

Android EventBus的使用

Android EventBus的使用项目中用到了以前没接触过的EventBus, 初步学习之后记录一下EventBus的用法:一、概述EventBus是一款基于观察者模式针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅以及将发送者和接收者解

seven_forjob的专栏 611
上一篇: Android .9图片的作用与制作
下一篇: Android AppWidget(桌面小部件-音乐播放动画)
Android_man_me
博客等级 码龄12年 10粉丝 11原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值