Android基础入门:EventBus实现总线数据分发

简介: 我们之前学习了Activity-》Activity中的数据传送,是通过intent.putExtra()方法实现的,如果要实现Activity-》Fragment或者Fragment-》Fragment都是不方便的,通过EventBus能很好的解决这个问题


背景知识

我们之前学习了Activity-》Activity中的数据传送,是通过intent.putExtra()方法实现的,如果要实现Activity-》Fragment或者Fragment-》Fragment都是不方便的,通过EventBus能很好的解决这个问题

基础简介

  • 事件:组件、线程中通信的信息单元
  • 事件发送者:事件(信息单元)的发送者
  • 事件订阅者:事件(信息单元)订阅方法的接收者

网络异常,图片无法展示
|

  1. 一个事件可以连接多个订阅者(即一个Activity中的数据可以传送给多个Activity接收)
  2. 事件的发送者也可以是订阅者(即Activity中自己数据的传送,此场景常用于切换线程)

引入依赖

implementation'org.greenrobot:eventbus:3.3.1'

场景:Activity->Activity

准备两个Activity

首先我们创建两个Activity,实现从Activity1跳转到Activity2,并且把Activity2中的数据传回到Activity1

网络异常,图片无法展示
|

在Activity1中设置一个跳转按钮

网络异常,图片无法展示
|

在Activity2中设置一个Button用于监听发送数据到Activity1

网络异常,图片无法展示
|

定义事件并创建事件发送者

在Activity2中实现按钮监听,向Activity1发送数据,这里举例用到的是String类型的数据

在这里Activity2充当的就是事件的发送者,“HNUCM"则就是事件,Activity1就是事件的订阅者

网络异常,图片无法展示
|

创建事件订阅者

在Activity1中实现页面跳转和事件注册

1.注册事件我们通过EventBus.getDefault().register()方法

/*注册EventBus,只用注册才能收到消息*/

       EventBus.getDefault().register(this);

2.创建一个public void的方法用于订阅事件

/*定义一个public void的方法接收其他的Activity通过eventbus发出的消息*/

   @Subscribe(threadMode=ThreadMode.MAIN)/*并且设置接收方法的线程,这里在主线程,可以通过这个方法实现线程切换*/

   publicvoidmessage(Strings){

       textView.setText(s);

   }

网络异常,图片无法展示
|

可以看到我们从Activity1跳到Activity2后,通过按钮监听将数据HNUCM发送给Activity1并成功显示在了文本控件上

网络异常,图片无法展示
|

疑问

此时是否会有一个疑问,在程序第一次运行进入Activity1界面时是否可以让Activity1和Activity2交换一下身份,让Activity1充当事件的发送者,Activity2充当事件的订阅者?

这显然是不可以的,因为在刚进入的程序时,Activity2还没有创建,没有添加在Android的任务栈中,数据发送出去是找不到订阅者的。

那么Activity1是在任务栈中的,所以我们可以让Activity1自己给自己发消息,即充当事件的发送者又充当事件的订阅者。看似这个功能没什么意义,其实这与 @Subscribe()联系起来作用就大了。

@Subscribe 中有一个参数

threadMode 线程模型ThreadMode ,它用来指定订阅者执行逻辑的线程,它有四个枚举值

  • POSTING:默认,表示事件处理函数的线程跟发布事件的线程在同一个线程。
  • MAIN:表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
  • BACKGROUND:表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
  • ASYNC:表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。

所以我们可以通过此功能实现线程切换


相关文章
|
2月前
|
开发工具 Android开发 开发者
Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
本文介绍了一种在Android平台上实现实时截图快照的方法,尤其适用于无需依赖系统接口的情况,如在RTMP推送、RTSP服务或GB28181设备接入等场景下进行截图。通过底层模块(libSmartPublisher.so)实现了截图功能,封装了`SnapShotImpl.java`类来管理截图流程。此外,提供了关键代码片段展示初始化SDK实例、执行截图、以及在Activity销毁时释放资源的过程。此方案还考虑到了快照数据的灵活处理需求,符合GB/T28181-2022的技术规范。对于寻求更灵活快照机制的开发者来说,这是一个值得参考的设计思路。
|
4月前
|
XML 存储 JSON
51. 【Android教程】JSON 数据解析
51. 【Android教程】JSON 数据解析
96 2
|
4天前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
21 7
|
15天前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
40 10
|
23天前
|
IDE Java 程序员
安卓应用开发入门:打造你的第一个“Hello World”
【9月更文挑战第11天】在编程的世界里,每一个初学者的旅程都从一个简单的“Hello World”开始。本文将带领安卓开发的新手们,通过简单直观的方式,一步步构建出自己的第一个安卓应用。我们将探索安卓工作室(Android Studio)的安装、项目的创建,以及如何运行和调试你的应用。无论你是编程新手还是想扩展技能的老手,这篇文章都将为你打开一扇通往安卓世界的大门。
77 7
|
23天前
|
IDE Java API
安卓应用开发入门:打造你的第一个"Hello World"
【9月更文挑战第11天】在探索安卓开发的海洋中,每个开发者的航行都从简单的"Hello World"开始。本文将作为你的航标,引导你驶向安卓应用开发的精彩世界。我们将一起启航,通过浅显易懂的语言和步骤,学习如何构建并运行你的第一个安卓应用。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供所需的知识和信心。准备好了吗?让我们揭开安卓开发的神秘面纱,一起创造些令人兴奋的东西吧!
|
2月前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
50 1
|
2月前
|
缓存 API Android开发
Android经典实战之Kotlin Flow中的3个数据相关的操作符:debounce、buffer和conflate
本文介绍了Kotlin中`Flow`的`debounce`、`buffer`及`conflate`三个操作符。`debounce`过滤快速连续数据,仅保留指定时间内的最后一个;`buffer`引入缓存减轻背压;`conflate`仅保留最新数据。通过示例展示了如何在搜索输入和数据流处理中应用这些操作符以提高程序效率和用户体验。
40 6
|
2月前
|
编解码 网络协议 前端开发
如何实现Android平台GB28181设备接入模块按需打开摄像头并回传数据
后台采集摄像头,如果想再进一步扩展,可以把android平台gb28181的camera2 demo,都移植过来,实现功能更强大的国标设备侧,这里主要是展示,收到国标平台侧的回传请求后,才打开摄像头,才开始编码打包,最大限度的减少资源的占用
|
2月前
|
编解码 网络协议 Android开发
Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧
我们在做Android平台GB28181设备对接模块的时候,遇到这样的技术需求,开发者希望能以后台服务的形式运行程序,国标平台侧没有视频回传请求的时候,仅保持信令链接,有发起视频回传请求或语音广播时,打开摄像头,并实时回传音视频数据或接收处理国标平台侧发过来的语音广播数据。
下一篇
无影云桌面