Android 线程、组件之间通信可以通过Handler消息处理器,BroadCast广播,Service服务等。
这儿介绍的EventBus是一款针对Android优化的发布/订阅的事件总线,可以替代上述的方法,进行线程之间传递消息.优点是开销小,代码更优雅。
EventBus主要是基于观察者模式,特点:
可以向不同的线程中发布事件,在ThreadMode 枚举中定义了4个线程,只需要在事件响应函数注解上加上ThreadMode ,则该事件响应函数就会在对应的线程中执行,ThreadMode定义的4个线程类型如下:
1、PostThread:事件响应函数和事件发布在同一线程中执行。这个是默认值,这样可以避免线程切换。
2、MainThread:事件响应函数会在Android应用的主线程(大部分情况下都是UI线程)中执行。
3、事件响应函数会在一个后台线程中执行。如果事件发布函数不是在主线程中,则会立即在事件发布线程中执行响应函数。如果事件发布函数在主线程中,EventBus则会在唯一的一个后台线程中按照顺序来执行所有的后台事件响应函数。
4、async:事件响应函数在另外一个异步线程中执行。该线程和发布线程、主线程相互独立。如果事件响应函数需要较长的时间来执行,则应该使用该模式,例如 网络访问等。需要注意的是,由于系统并行的限制,应该避免在同一时间触发大量的异步线程。 EventBus使用一个线程池来提高线程的效率。
demo地址:
https://github.com/592713711/EventBusDemo
步骤
一 导入EventBus包 (包demo中)
二 将Activity注册成为事件订阅者(观察者)
Java代码 收藏代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册事件总线 让当前对象成为观察者
EventBus.getDefault().register(this);
initView();
}
@Override
protected void onDestroy() {
super.onDestroy();
//注销
EventBus.getDefault().unregister(this);
}
三 在Activity中实现消息回调函数
Java代码
/**
* 观察对象数据改变 触发
* 不加 threadMode 默认在哪发的事件 就从哪个线程执行 ThreadMode.POSTING
* ThreadMode.MAIN:在创建方法中的线程中执行
*
* @param s
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void showInfo(String s) {
Log.d(TAG, "MAIN " + Thread.currentThread().getName() + " " + s);
}
/**
* ThreadMode.POSTING:在发送线程中执行
*
* @param s
*/
@Subscribe(threadMode = ThreadMode.POSTING)
public void showInfo2(String s) {
Log.d(TAG, "POSTING " + Thread.currentThread().getName() + " " + s);
}
/**
* ThreadMode.BACKGROUND:后台执行
* 若是主线程发布事件,会启动子线程执行该方法
* 若在子线程发布事件 就在当前子线程执行该方法
*
* @param s
*/
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void showInfo3(String s) {
Log.d(TAG, "BACKGROUND " + Thread.currentThread().getName() + " " + s);
}
/**
* ThreadMode.ASYNC:在新线程中执行 不管在哪创建和发布 都会新启动一个执行
*
* @param s
*/
@Subscribe(threadMode = ThreadMode.ASYNC)
public void showInfo4(String s) {
Log.d(TAG, "ASYNC " + Thread.currentThread().getName() + " " + s);
}
注意:
1 回调函数必须要加上Subscribe,函数名无要求
2 回调函数的参数决定该接受的类型,上述的函数只能接受传递字符串的消息
四 在子线程中发布消息
Java代码
new Thread(
new Runnable() {
@Override
public void run() {
Log.d(TAG, "发布 " + Thread.currentThread().getName());
EventBus.getDefault().post("info");
}
}
).start();
五 程序输出
可以看出在子线程中发布消息时:
用POSTING模式时方法是在该子线程中执行
用BACKGROUND模式时方法是在该子线程中执行
用MAIN模式时方法是在主线程中执行
用ASYNC模式时在线程池中单独取出一个线程,在其中执行方法
有兴趣的朋友可以试试在主线程中发布消息看看程序输出
补充:
1 由于post时传入的参数是Object,所以回调函数的参数如果要是int的话,必须改为Integer
2 用了EventBus一段时间后,发现并没有像handler中有延迟发送消息的方法,所以感觉EventBus并不能完全替代Handler

- 大小: 3.9 KB

- 大小: 1.6 KB
分享到:
相关推荐
### Vue.js 基本内容总结学习 ...以上就是关于 Vue.js 的基本内容总结学习,涵盖了组件通信、异步渲染以及双向数据绑定原理等方面的知识点。希望这些内容能够帮助读者更好地理解和掌握 Vue.js 的核心概念和技术细节。
8. **事件总线**:事件驱动通信是现代Android开发的常见实践,项目可能使用EventBus或RxBus来实现组件间的通信。 9. **图片加载库**:为了优化图片显示,可能引入了Glide或Picasso等库来加载和缓存网络图片。 10. ...
8. **事件总线**:可能使用EventBus或RxBus来实现组件间的通信,提高代码的解耦度。 9. **测试**:项目可能包含单元测试和UI测试代码,使用JUnit或 Espresso进行功能验证。 10. **版本控制**:源代码很可能使用Git...
9. **事件监听系统**:Guava的EventBus可以实现松耦合的事件发布和订阅模式,使得模块之间的通信更为简单。 10. **Guava的API设计原则**:书中也会探讨Guava如何通过API设计实现高效、安全和可维护性,这对其他Java...
mqttfx测试工具(亲测好用)
内容概要:本文介绍了如何在Matlab环境下实现GWO-GRU多变量回归预测模型。文中详细描述了从数据准备到模型训练和评估的完整流程。首先,准备好包含多个变量历史数据的数据集。其次,在MainGWO_GRUNN.m主文件中完成数据预处理、GRU模型构建以及采用灰狼算法对关键参数如学习率、隐藏层节点个数和正则化参数进行优化。之后,使用优化后的参数训练GRU模型并计算R2、MAE和MBE等评价指标以衡量模型性能。最后,通过命令行输出这些指标值,便于后续调整和改进。 适合人群:对机器学习尤其是时间序列预测感兴趣的科研工作者和技术爱好者。 使用场景及目标:适用于需要处理复杂非线性关系的时间序列数据分析任务,旨在提升预测精度和稳定性。 其他说明:文中提供了部分Matlab代码片段作为参考,但具体实现还需依据个人项目特点做适当修改。同时鼓励读者尝试不同配置组合以找到最适合自身应用场景的最佳解决方案。
DGIOT是国内首款轻量级开源工业物联网平台,我们致力于提供五类物联网解决方案:国企/研究院:平台代码开源,无版权产权困扰,国产无“卡脖”之忧;系统集成商:通用设备海量接入、定制设备二次开发、6分钟一键式私有化快速部署,低成本(降90%成本);工业设备制造商:海量设备上线运维,不受公有云限制,低成本,短周期自建平台,私有化部署,数据安全;开源平台开发者:一键式开发环境,集成和兼容各种最优开源工具,快速承接物联网项目;垂直领域物联网平台:快速部署私有化平台,千万级承载,运营级底座,全开放扩展
N1021-90001
内容概要:本文详细介绍了将12V直流电转换为220V交流电的两种成熟设计方案,分别适用于6W和12W功率需求。文中不仅提供了详细的电路设计、变压器设计以及元件选择,还包括了实际调试过程中遇到的问题及其解决方案。对于6W方案,采用EG8010 SPWM芯片进行驱动,强调了死区时间和变压器绕制方法的重要性;而12W方案则使用EGS002驱动板,增加了闭环反馈机制,并详细列出了关键元器件的选择标准。此外,作者还分享了一些实用的经验技巧,如避免常见错误和测试方法。 适合人群:电子工程技术人员、电源设计爱好者、硬件工程师。 使用场景及目标:①需要将12V直流电转换成220V交流电的应用场合;②希望深入了解电源转换电路设计的技术人员;③希望通过实例学习电源设计与调试的新手。 其他说明:文中提供的所有资料均基于实际项目经验总结而成,具有较高的参考价值。同时,作者还开放了完整的代码和PCB设计文件供读者下载学习。
Python之PyInstaller打包过程对新手来说,特别是资源路径的处理,实在是太麻烦了,能否用Tkinter实现GUI(Graphical User Interface,图形用户界面/接口)包装PyInstaller,方便使用呢?我这里给出实现。
数据集介绍:淋巴细胞、中性粒细胞与鳞状细胞癌检测数据集 一、基础信息 数据集名称:淋巴细胞、中性粒细胞与鳞状细胞癌检测数据集 数据规模: - 训练集:5,205张医学图像 - 验证集:240张医学图像 - 测试集:220张医学图像 病理分类: - Lymphocytes(淋巴细胞):免疫系统核心细胞,参与病毒防御与肿瘤监控 - NE(中性粒细胞):急性炎症标志物,反映感染与组织损伤 - SCC(鳞状细胞癌):常见上皮组织恶性肿瘤,需早期精准识别 标注规范: - YOLO格式标注,支持目标检测模型训练 - 包含多边形坐标标注,适配病理切片分析需求 二、核心应用 数字病理诊断系统: 支持开发白细胞亚型自动分类系统与鳞癌检测算法,辅助显微镜图像分析,提升病理科工作效率。 血液病辅助诊断: 通过淋巴细胞/中性粒细胞比例分析,为白血病、淋巴瘤等血液疾病提供AI辅助判断依据。 癌症筛查研究: 包含鳞状细胞癌阳性样本,适用于皮肤癌、头颈癌等上皮源性肿瘤的早期筛查模型开发。 医学影像教学: 提供标注规范的病理图像数据,适用于医学院校的细胞形态学教学与AI医疗交叉学科实训。 三、核心优势 临床病理学深度适配: 涵盖血液系统关键细胞类型与高发癌症类别,标注经病理专家双重校验,确保医学准确性。 多场景检测能力: 同时支持血涂片细胞分类与组织切片癌变区域检测,满足复合型医疗AI产品开发需求。 数据分布专业化: 按医学研究标准划分训练集/验证集/测试集,包含典型病例与边缘案例,强化模型鲁棒性。 跨任务兼容性: YOLO标注格式可直接用于目标检测训练,同时支持转换为分类、实例分割等扩展任务。
内容概要:本文介绍了利用Carsim和Matlab/Simulink进行多点预瞄模糊控制的联合仿真的方法和技术细节。主要内容涵盖双移线工况下理想的轨迹生成、预瞄点处理模块的设计以及模糊控制器的具体实现。文中特别强调了动态调整预瞄点权重的方法及其对车辆侧向加速度的影响,并展示了不同驾驶条件下预瞄距离补偿机制的作用。此外,还提到了一些优化措施如移动平均滤波的应用来提高系统的稳定性和响应性能。 适用人群:汽车工程领域的研究人员、自动驾驶系统开发者、高校相关专业师生。 使用场景及目标:适用于需要深入理解和掌握复杂交通环境下的智能车辆控制系统设计的研究人员;旨在帮助读者构建高效的联合仿真平台,探索先进的路径规划和跟踪控制策略。 其他说明:提供的Simulink源码文件和详细的建模说明文档有助于加速项目开发流程并促进学术交流。
微软常用运行库合集
内容概要:本文介绍了如何利用组态王7.5版本为冲压机设计并实现高效的监控系统。系统涵盖五个主要画面,分别是主画面、设备运行画面、报表画面、仿真带画面以及曲线报警画面。每个画面都针对不同的监控需求进行了优化设计,旨在提供全面的设备信息、运行状态、报警提示和数据分析。系统不仅实现了数据的实时采集与处理,还能通过曲线报警功能及时发现并响应异常情况,从而保障了生产的稳定性和安全性。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些负责冲压机管理和维护的专业人士。 使用场景及目标:适用于需要提升冲压机监控水平的企业,目标是通过引入先进的监控系统来提高生产效率和产品质量,减少停机时间,增强设备的安全性和可靠性。 其他说明:文中提到的组态王7.5版本和6.55版本分别用于实际监控系统的构建和仿真实验,两者配合使用能够有效验证设计方案的有效性,并为后续改进提供依据。
内容概要:本文详细介绍了基于51单片机(STC89C52)的多功能波形发生器系统的仿真设计与实现。该系统能够通过按键切换不同类型的波形(如正弦波、方波、三角波、锯齿波及其组合),并且可以通过滑动变阻器调节波形的幅度(0-5V),以及通过按键设置频率步进值来调节波形频率(10-2000Hz)。此外,还实现了对方波占空比的调节(10%-90%)。文中提供了详细的硬件连接图解、关键代码片段(如定时器初始化、中断服务程序、波形表生成等),并讨论了一些实际应用中的注意事项和技术细节,如波形失真、ADC采样、数码管显示等问题。 适合人群:对嵌入式系统开发感兴趣的电子工程学生、单片机爱好者、初级硬件工程师。 使用场景及目标:适用于学习51单片机的应用开发、波形发生器的设计与实现、掌握C语言编程技巧、理解定时器中断机制、熟悉Proteus和Keil5软件的使用。 其他说明:文中提到的波形表可以使用Python生成,有助于提高开发效率。对于频率过高的情况,文中给出了优化建议,如更换更高主频的单片机或优化中断服务程序。
数据集介绍:自动驾驶交通障碍物目标检测数据集 一、基础信息 数据集名称:自动驾驶交通障碍物目标检测数据集 数据规模: - 训练集:10,627张图片 - 验证集:1,298张图片 - 测试集:1,272张图片 分类类别: - Car(汽车):道路主要交通工具,包含多种车型 - Motorbike(摩托车):两轮机动车辆及骑行者 - Person(行人):道路行人及动态行为 - Pole(杆状物):路灯杆、交通标志杆等垂直障碍物 - Reflective_cone(反光锥):道路施工警示标识 - Truck(卡车):大型货运车辆及特殊运输车 标注格式: YOLO格式标注,包含边界框坐标与类别编码,适配YOLOv3/v5/v8等主流检测框架 二、适用场景 自动驾驶感知系统开发: 训练车载摄像头实时识别道路障碍物,支持ADAS系统进行碰撞预警和路径规划 交通监控系统优化: 提升电子警察系统对复杂交通元素的识别准确率,支持违章行为分析 机器人视觉导航: 为服务机器人/AGV提供室外环境感知能力,实现动态障碍物避让 学术研究应用: 支持多目标检测算法研究,包含小目标(反光锥)与大尺度目标(卡车)的检测优化 三、数据集优势 场景适配性强: 覆盖6类道路核心障碍物,包含静态设施(杆状物)与动态目标(行人、车辆)的多样化组合 标注专业化: 采用YOLO工业标准标注规范,坐标精度达小数点后6位,支持像素级检测需求 数据分布均衡: 万级训练样本量配合科学划分的验证/测试集,满足模型开发全流程需求 跨模型兼容性: 原生支持YOLO系列算法,可快速迁移至Faster R-CNN、RetinaNet等检测框架
气柜,全球前10强生产商排名及市场份额(by QYResearch).pdf
PAM4_AMI_Doc.pdf
内容概要:本文深入探讨了三相级联H桥逆变器的仿真模型,特别是七电平和十一电平逆变器的设计与控制方法。首先介绍了H桥逆变器的基本概念及其在高压大功率应用场景中的重要性。接着详细解释了七电平和十一电平逆变器的工作原理,强调了多电平输出对降低谐波失真的关键作用。随后重点讨论了两种主要的控制方法——载波移相和载波层叠,分别阐述了这两种方法的具体实现方式及其在MATLAB/Simulink和Python仿真环境中的应用。最后,文章还提到了仿真模型的建立与验证过程,确保模型的准确性和可靠性。 适合人群:从事电力电子领域的研究人员和技术人员,尤其是对多电平逆变器和先进控制方法感兴趣的读者。 使用场景及目标:适用于需要深入了解三相级联H桥逆变器工作原理和控制策略的研究人员,帮助他们掌握最新的仿真技术和优化方法,提升系统性能和电能质量。 其他说明:文中提供了详细的理论背景和具体的仿真实例,有助于读者更好地理解和应用相关技术。
本书《深入Laravel:超越CRUD》由布伦特·鲁斯撰写,旨在教授读者如何构建和维护超出平均水平大小的Laravel应用程序。书中详细介绍了Spatie团队在过去三年中积累的实践经验,包括领域驱动设计、数据处理、动作组合、模型构建、状态管理、枚举使用、领域管理、测试实践、应用层结构以及HTTP查询和作业处理等方面的内容。作者强调了在团队中讨论并形成指导方针的重要性,并鼓励读者与同事讨论书中的内容,以适应不同团队的实用主义与严格性偏好,从而构建出既美观又可维护的项目。