EventBus在项目中的应用

源码解析之EventBus注册流程 一,写在前面 EventBus的使用还是比较简单的,对于框架的使用,不仅仅是知其然,更要知其所以然,还可以学到框架里一些优秀的设计理念。本篇文章将从源码角度解析EventBus的注册流程,对框架的使用可参考文章EventBus的使用。 二,EventBus构造方法 在使用EventBus订阅事件时,一般会调用EventBus.getDefault()获取EventBus的实例,它返回一个系统... 阅读详情

参考 http://blog.youkuaiyun.com/harvic880925/article/details/40660137,http://blog.youkuaiyun.com/harvic880925/article/details/40787203


什么是EventBus

EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法。特点是代码简洁,是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式。

如何使用EventBus

1. 定义事件, 定义一个类,继承默认的Object即可,用于区分事件和传输数据。 本例为FirstEvent 
2. 添加订阅者:EventBus.getDefault().register(this); 将所在类作为订阅者,框架会通过反射机制获取所有方法及其参数。
    订阅者所在类可以定义以下一个或多个方法用以接收事件:

         public void onEvent(FirstEvent msg)

        public void onEventMainThread(FirstEvent msg)

        public void onEventBackgroundThread(FirstEvent msg)

        public void onEventAsync(FirstEvent msg)

     这四种订阅函数都是使用onEvent开头的,它们的功能稍有不同,在介绍不同之前先介绍两个概念:
告知观察者事件发生时通过EventBus.post函数实现,这个过程叫做事件的发布,观察者被告知事件发生叫做事件的接收,是通过下面的订阅函数实现的。

           onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方      法中    不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。

 
           onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个         在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。

 
            onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来        的,那么onEventBackground函数直接在该子线程中执行。

 
             onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

 

3. 发布者发布事件:EventBus.getDefault().post(new FirstEvent ("主线程发的消息1"));
    一旦执行了此方法, 所有订阅者都会执行第二步定义的方法。
4. 取消订阅:EventBus.getDefault().unregister(this); 当订阅者不再被使用,或者被关闭时,最好进行取消订阅,不再接受事件消息。
5. 注意事项:发布者post方法参数是Object类型,也就是可以发布任何事件。订阅者接受消息时,只要定义的是第二步四个方法任意一个,并且参数和发布者发布的一致,即可被执行。发布者也可以通过第二步接收消息,订阅者也可以作为发布者发消息给自己。

   示例代码

  • 发送消息的类

    发送消息是使用EventBus中的Post方法来实现发送的
    1. public class SecondActivity extends Activity {  
    2.     private Button btn_FirstEvent;  
    3.   
    4.     @Override  
    5.     protected void onCreate(Bundle savedInstanceState) {  
    6.         super.onCreate(savedInstanceState);  
    7.         setContentView(R.layout.activity_second);  
    8.         btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);  
    9.   
    10.         btn_FirstEvent.setOnClickListener(new View.OnClickListener() {  
    11.   
    12.             @Override  
    13.             public void onClick(View v) {  
    14.                 // TODO Auto-generated method stub  
    15.                 EventBus.getDefault().post(  
    16.                         new FirstEvent("FirstEvent btn clicked"));  
    17.             }  
    18.         });  
    19.     }  
    20. }  


  •  接收消息的类
    1. public class MainActivity extends Activity {  
    2.   
    3.     Button btn;  
    4.     TextView tv;  
    5.   
    6.     @Override  
    7.     protected void onCreate(Bundle savedInstanceState) {  
    8.         super.onCreate(savedInstanceState);  
    9.         setContentView(R.layout.activity_main);  
    10.   
    11.         EventBus.getDefault().register(this);  
    12.   
    13.         btn = (Button) findViewById(R.id.btn_try);  
    14.         tv = (TextView)findViewById(R.id.tv);  
    15.   
    16.         btn.setOnClickListener(new View.OnClickListener() {  
    17.   
    18.             @Override  
    19.             public void onClick(View v) {  
    20.                 // TODO Auto-generated method stub  
    21.                 Intent intent = new Intent(getApplicationContext(),  
    22.                         SecondActivity.class);  
    23.                 startActivity(intent);  
    24.             }  
    25.         });  
    26.     }  
    27.   
    28.     public void onEventMainThread(FirstEvent event) {  
    29.   
    30.         String msg = "onEventMainThread收到了消息:" + event.getMsg();  
    31.         Log.d("harvic", msg);  
    32.         tv.setText(msg);  
    33.         Toast.makeText(this, msg, Toast.LENGTH_LONG).show();  
    34.     }  
    35.   
    36.     @Override  
    37.     protected void onDestroy(){  
    38.         super.onDestroy();  
    39.         EventBus.getDefault().unregister(this);  
    40.     }  
    41. }  


  • 消息的bean类
    1. public class FirstEvent {  
    2.   
    3.     private String mMsg;  
    4.     public FirstEvent(String msg) {  
    5.         // TODO Auto-generated constructor stub  
    6.         mMsg = msg;  
    7.     }  
    8.     public String getMsg(){  
    9.         return mMsg;  
    10.     }  
    11. }  


    使用心得
  • 接收消息时,是通过订阅者的方法中的参数区分是谁发送的消息。比如,在订阅者的方法里有两个接收方法: public void onEvent(FirstEvent msg){}, public void onEvent(SecondtEvent msg),发布  EventBus.getDefault().post( new FirstEvent("FirstEvent btn clicked"))时,只有public void onEvent(FirstEvent msg){}方法会执行;
  •  EventBus.getDefault().unregister(this),这种注册的方法是一种单例模式,也就是无论在哪个类中注册,只会使用已经存在的EventBus实例对象。当在ViewPager中使用时,当在第一个pager中使用单例的方法注册,在第二个pager中也是用单例注册。当页面由第一个pager切换到第二个pager时,第一个pager不会被销毁,因此不会走onDestroy()方法,结果就是这个EventBus没有被取消注册,第二个pager中又调用注册EventBus的方法,这是就会报一个“不能重复注册EventBus”错误。 解决方法:不用单例注册EventBus,通过new EventBus()实例化,在进行注册。
【android】EventBus原理 在公司实习,小组的项目使用到这个框架,尽管一直在使用,很顺手很好用,但是不怎么明白里面的原理,赶着最近准备找工作,总结一下吧。EventBus–ReadMe必然要先从官方文档开始,最然看不怎么懂,但是看看官方的总结还是很有用的。EventBus is a publish/subscribe event bus optimized for Android.EventBus 是一个针对Android优化 阅读详情

相关推荐

EventBusDemo:实践Git与EventBus在Android中的应用

EventBus包含几个核心组件,它们协同工作以实现事件的发布和订阅机制:EventBus实例:通常创建一个EventBus实例来发布和订阅事件。可以创建多个实例以隔离不同的通信通道。@Subscribe注解:贴在订阅者方法上,表明该方法是一个事件处理方法。Poster:发布事件时,EventBus使用Poster将事件分发到适当的线程。:用于优化注册过程,EventBus可以使用SubscriberIndex预索引订阅者信息,提高性能。

weixin_35755188的博客 690

EventBus使用详解

EventBus由greenrobot组织贡献(该组织还贡献了greenDAO),一个Android事件发布/订阅轻量级框架。 当我们进行项目开发的时候,往往是需要应用程序的各组件、组件与后台线程间进行通信,比如在子线程中进行请求数据,当数据请求完毕后通过Handler或者是广播通知UI,而两个Fragment之家可以通过Listener进行通信等等。当我们的项目越来越复杂,使用Int...

qq_36699930的博客 711

EventBus框架在Android应用中的集成与应用实例分析

EventBus是一种用于Android和Java的发布/订阅事件总线框架。它允许组件之间进行松耦合的通信,简化了组件之间的通信,特别适用于Android开发中组件间的通信。EventBus通过注解的方式来定义事件,使用方便且效率高。发布/订阅模式是一种消息传递机制,允许发布者(发布者)将消息或事件发送到订阅者(消费者),而不需要直接知道彼此的身份。这个模式由三个核心组成部分构成:事件(Event):消息本身,通常是一个自定义类,携带有关发生事件的数据。发布者(Publisher)

weixin_32999557的博客 1026

EventBus(三register分析)

EventBus(三register分析) EventBus使用register方法是我们用来注册订阅者的,接下我将从这个方法入手,跟踪源码进行分析。 public void register(Object subscriber) { // 获取类对象,明显通过反射获取方法 Class<?> subscriberClass = subscriber.getClass...

qq_39564130的博客 844

华为海思2026届数字IC秋招笔试高频考点解析与实战技巧(2025最新版)

本文深入解析华为海思2026届数字IC秋招笔试的高频考点与实战技巧,涵盖时序优化、低功耗设计、DFT规则等核心模块。针对2025年最新真题,提供详细的解题思路和工程经验,帮助考生高效备考。特别关注SystemVerilog约束随机测试等新增考点,助力考生在秋招笔试中脱颖而出。

m2n3o4p5的博客 417

【VS2017】“LNK1104 cannot open file ‘python39_d.lib‘ “

记录一下编译调用了python代码的C语言源程序时遇到的问题 版本:以python3.9.1为例 先确保你安装了python的debug版本,如果没有,用对应版本安装包可以修改已经安装的python,如图。 选择 “Modify” 选择next 确保最后一项勾选,然后install。 光安装了还不够,需要配置一下C语言编译器。 以VS2017为例: 将python37_d.lib(在安装目录下的libs文件夹里有python39_d.lib)所在文件夹的路径添加到库目录里面,右键你的解决方案,选.

m0_46296905的博客 6478

【EventBus】EventBus 源码解析 ( 注册订阅者 | 注册订阅方法详细过程 )

前言、 一、EventBus 注册订阅者、 二、注册订阅方法的具体过程、 三、Subscription 类、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1469

避开这5个坑!Tushare金融数据获取与分析的常见错误排查指南

本文详细解析了使用Tushare进行金融数据获取与分析时常见的5个问题,包括Token失效、数据缺失、频率限制、数据一致性和性能瓶颈,并提供了实用的解决方案和优化策略。通过Python代码示例和最佳实践,帮助金融数据分析师和量化开发者高效避开这些陷阱,提升工作效率。

x2y3z4a5b的博客 1038

EventBus在自定义View中的使用

刚刚看到项目中,前人 EventBus在自定义View中使用,得到:EventBus的使用:法一:在Activity或Fragment中使用,传递或者接受消息。如果需要修改自定义View的状态,可以将自定义View的方法暴露出来,在Activity或Fragment中调用。法二:在自定义View中使用,传递或者接受消息,Unregister可以在Activity或者Fragment的onDesto...

佩恩的博客 4652

科研级实战】YOLOv11 pose部署至RK3588全流程:让姿态估计模型在边缘端毫秒级运行,我来帮你突破人体行为分析落地壁垒

在智慧安防人体行为分析场景中,基于YOLOv11 pose的模型在云端推理单帧耗时150ms,硬件成本超15000元;经本方案部署到RK3588后,单帧推理耗时降至30ms,硬件成本仅4000元,且关键点检测准确率高达93%以上。在运动姿态评估场景,同款技术路径使模型边缘端推理速度提升6倍,姿态分类精度达95%。这意味着,你也能让自己的姿态估计模型在边缘设备上实现的工业化落地,接下来让我们开启从模型训练到端侧部署的实战征程。

m0_71589036的博客 223

36、转子 - 主动磁轴承系统建模及密封性能研究

本文研究了转子-主动磁轴承(AMBs)系统的动力学建模、稳定性分析及密封性能。通过建立包含转子、电子控制系统和接口接触的机电模型,结合Bernoulli-Euler梁理论与弹簧单元等效法,构建了考虑接口接触的闭环系统模型,并在磁悬浮鼓风机和电机上进行数值模拟与实验验证,结果表明接口接触刚度显著影响系统稳定性,尤其在高预紧扭矩下易激发弯曲模态失稳。同时,对非接触式低温密封进行了CFD仿真与实验测试,发现浮动环密封(FRS)具有最优的泄漏控制和抗磨损性能。研究成果为提升高速旋转机械的稳定性和密封可靠性提供了理论

vim8coder的博客 135

EventBus在项目中的简单应用

首先来了解下EventBus EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法。特点是代码简洁,是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式。 接下来看下EventBus的使用步骤: 第

smily的博客 2642

YOLOv11【第二十章:模型迭代与生态闭环篇·第1节】在线增量学习——部署后新数据自动回流重训!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 433

Flutter EventBus事件总线的应用

flutter项目中,有许多可以实现跨组件通讯的方案,其中包括InheritedWidget,Notification,EventBus等。本文主要探讨的是EventBus事件总线实现跨组件通讯的方法。

嘴巴吃糖了 1826

Vue和Vue-Element-Admin(六):集成中的CORS(跨域资源共享)问题

在vue-element-admin登录集成时候碰到跨域资源共享问题,CORS(Cross-origin resource sharing)是浏览器的技术规范,浏览器可以发起跨域请求但Javascript脚本不能,传统的ajax只能获取在同域名下的资源,但Html5允许ajax发起跨域请求,解决方案有:JSONP、Flash、IFrame、CORS。 一、CORS(跨域资源共享)问题 针对vue-element-admin的登录模块的后端接口完成后,前端调用时候出现报错,因为前端的端口是9527而后.

叶子叶来 9615

Pytorch中安装 torch_geometric 详细图文操作(全)

如果已经安装了pytorch版本,对应跳过步骤一,直接安装步骤二即可注意:依赖包的配置需要根据pytorch版本号以及cuda的版本号,版本号要适配,否则部分函数无法使用。

码农研究僧的博客 3448

EventBus简单应用

Activity之间传输数据——EventBus 1,EventBus? EventBus GitHub源码地址。 一篇介绍EventBus非常详细的 简书文章 。 EventBus主要用来简化程序中的各个组件之间的通信难度,避免广播通信造成的一些问题。 1.1 主要成员 订阅者订阅事件到总线,发送者发布事件。 (1)Event 事件 其类型不定,可以根据数据需求自行设计。EventBus会根据事件类型自行进行全局通知。 (2)SubScriber 事件订阅者 用来定义特定的方法,使

weixin_45207113的博客 179

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android EventBus在Activity、Fragment、Service中的使用

Android EventBus在Activity、Fragment、Service中的使用

weixin_42602900的博客 1043

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android EventBus 3.0

项目地址: github 地址 eventBus能做什么?为我们解决什么问题? 1.通信,各组件信息的传递,而且是在任何时候,信息内容可以是简单的标识,也可以是json数据,等; 2.项目中总有两个组件藕断丝连,甚至完全不搭边;但是从业务逻辑上,界面显示上做同步处理; 这个时候 eventBus 出场了;使用其他方法代码臃肿,可读性差的自己都不想看;而eve...

weixin_36965072的博客 1232

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Flutter之初识eventBus

一、EventBus介绍 在Android事件总线库中,EventBus库是最广泛之一。 发布者/订阅者模式 集中式通信 低耦合,简化组件通信 在APP中,常常需要一个广播机制,用以跨页面事件通知。好比从第一个页面跳转到第二个页面,用户在第二个页面操做的动做行为要及时反馈到第一个页面中(如刷新页面中的数据)。这种场景,一个事件总线便会很是有用,事件总线一般实现了订阅者模式,订阅者模式包含发布者和订阅者两种角色,能够经过事件总线来触发事件和监听事件。 二、自定义EventBus 步骤1.

可可的博客 1496

eventBus VSvueX

EventBus & Vuex? 组件通信 在很久很久以前,在Vue王国里有一个组件塔,有一个组件家族,A,B,C,组件父亲A和儿子B,C生活在不同的层级之间,他们相隔非常远。 父->子 这个时候,父亲想念儿子了,想给他寄信,怎么办呢?简单!在每一个子组件上都有一个props “邮箱”,通过这个邮箱,父亲可以直接投递邮件(data) Vue.component('blog-post', { // 在 JavaScript 中是 camelCase 的 props

chris1299的博客 1767

eventbus使用_Vue事件总线(EventBus)使用详细介绍

前言vue组件非常常见的有父子组件通信,兄弟组件通信。而父子组件通信就很简单,父组件会通过 props 向下传数据给子组件,当子组件有事情要告诉父组件时会通过 $emit 事件告诉父组件。今天就来说说如果两个页面没有任何引入和被引入关系,该如何通信了?如果咱们的应用程序不需要类似Vuex这样的库来处理组件之间的数据通信,就可以考虑Vue中的 事件总线 ,即 **EventBus**来通信。Even...

weixin_39972996的博客 118

EventBus 最简易的使用方式

呃,要跟上时代的步伐,所以来学习一下EventBus(话说好像现在学也已经算是跟不上了。。嘛。。不管了,一步一步往前追,应该还来得及吧)。看了网上一些的关于eventBus的文章,上来就叽里呱啦一大堆总结啊,概述啊。。上个原理图啊什么的。。 这样写虽然好,但是总会给一些初学者打一些退堂鼓。看到那么复杂就不想看下去了。。 所以在自己学习的过程中,想写一些直观的,精简的,适合初学者的博客。现在开始吧

旋转 跳跃 然后 团灭 2482

EventBus

参考文档:电梯直达 EventBusUtils //订阅者回调签名 typedef void EventCallback(arg); ///* 作者:guoyzh ///* 时间:2020年1月7日 ///* 功能:创建eventBus工具类 class EventBus { /// 私有构造函数 EventBus._internal(); /// 保存单例 static EventBus _singleton = new EventBus._internal(); /// 工厂...

大灰狼的小绵羊哥哥的博客 187

google.common.eventbus.EventBus

1.在xml中定义bean <bean id="eventBus" class="com.google.common.eventbus.AsyncEventBus"> <constructor-arg value="pkg-analysis" /> <constructor-arg ref="asyncTaskExecutor"/> </bean> 2.在使用的地方注册与监听事件 2.1定义基础事件 public interface B

u010603891的博客 1359

EventBus的基本使用步骤

为什么要使用EventBus 当我们进行项目开发的时候,往往是需要应用程序的各组件间进行通信,比如在子线程中进行请求数据,当数据请求完毕后通过Handler或者是广播通知UI, 通常两个Activity或者Fragment之家可以通过Listener进行通信等等。但当我们的项目越来越复杂,使用Intent、Handler、Broadcast进行模块间通信时,代码量大,而且高度耦合。而EventB...

songjianzaina的博客 456
上一篇: 安卓5.0正常运行,5.0以下NoClassDefFoundError
下一篇: 仿网易腾讯新闻主界面功能
Run_Forrest_Run
博客等级 码龄11年 0粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值