Android开发之数据传递的桥梁——Bundle

news2024/10/7 2:22:36

解释

在安卓sdk源码中,Bundle类的说明是这样的

A mapping from String keys to various Parcelable values.
See Also:
PersistableBundle

public final class Bundle extends BaseBundle implements Cloneable, Parcelable

字符串的键到持久化值的映射。

作用

经常被用作Activity跳转时传递数据,也时常被用作Handler传递Message时携带数据。

Activity跳转时传递数据最常见

Bundle bundle = new Bundle();

 所有可传递的数据类型如上图。

不过,在开发过程过程中,迭代是不可避免的,随着需求和业务增多,页面之后传递的值也可能会逐渐增多,如果接手别人迭代过的项目,可能页面传递的值多的根本看不懂,也不能轻易删除,牵一发而动全身。也可能会把自己的烂摊子留给其他人,此时,如果能留下一手漂亮的迭代版本,成就感会很强。

所以如何避免随着迭代导致的传递数据困难呢?可以用实体类封装传递的数据。

但是实体类是一个(object)对象,而bundle又不支持传递对象。可能有开发经验的同学知道用序列化的方式传递对象,当然也不失为很好的一种方法。

这里我有一个粗鄙的方法分享一下(实体类如果用java的方式表现,可能代码量会很大,这里我用kotlin做了简化):

data class MyData(
    var user: String = "",
    var name: String = "",
    var age: String = "",
    var height: String = "",
    var width: String = "",
    var weight: Int = 0,
    var father: Int = -1,
    var mother: Int = 0,
    var son: Int = 0,
    var daughter: String = "",
    var sister: String? = "",
    var brother: String? = "",
    var friend: String = ""
) {
    override fun toString(): String {
        return "{user:\"$user\"," +
                "name:\"$name\"," +
                "age:\"$age\"," +
                "name:\"$name\"," +
                "height:\"$height\"," +
                "width:\"$width\"," +
                "weight:\"$weight\"," +
                "father:\"$father\"," +
                "mother:\"$mother\"," +
                "son:\"$son\"," +
                "daughter:\"$daughter\"," +
                "sister:\"$sister\"," +
                "brother:\"$brother\"," +
                "friend:\"$friend\"}"
    }
}

重写toString方法,把实体类的字段转化成json类型,这样就可以通过putString的方式把这个实体类传递到目标Activity;

在目标Activity中通过Gson工具把json字符串转化成实体类对象就可以完成传递。

val myData = Gson().fromJson("", MyData::class.java)

这种方式传递,可以有效避免因为迭代增加传递量的增大导致的代码阅读难度高,逻辑复杂等问题。

后期增加字段时,只需要给实体类增加一个字段,然后扩充一下toString方法中的json字段就可以完成需求,这种零存整取的方法不仅看着简介,使用起来也很方便。

如果有同学使用过EventBus,也可以完成上述需求。不过我个人不太推崇EventBus。因为如果项目迭代过程中代码量增大,EventBus乱用会导致逻辑非常复杂。尤其是UI和Data交互时,大量的EventBus重写的方法会让逻辑交互产生很多耦合现象。

EventBus比较适合用于小项目,或者模块之间的数据传递,Activity之间的数据传递尽可能使用原生的Bundle。

Handler中传递Message的用法和Acvitiy基本一样。Message的优势在与可以直接传递Object

val camera = Camera()
val message = Message()
message.what = 0x00
message.obj = camera
handler?.sendMessage(message)

建议

可能有人尝试过用Bundle携带Bitmap这样的对象,遇到过报错。

对于这种占用空间很大的对象,不建议或者说禁用Bundle传递,最好的做法是把这样的对象保存到本地,然后传递url的方式,在目标Activity中重写加载读取对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/642114.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

只用2个小时,我把公司的进销存流程全部搬到了线上!

目录 一、前言 二、线下流程的弊端 三、仅用2个小时,如何将流程搬到线上? (1)基础资料模块 (2)采购管理模块 (3)销售管理模块 (4)库存管理模块 &…

MySQL之视图,触发器与存储过程

一、视图 视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。 使用视图我们可以把查询过程中的…

基于虚拟化的物联网沙盒操作系统

了解她的技术 先谈谈虚拟化吧! 为什么要有虚拟化?物理CPU,物理内存和存储,物理网络的硬件能力越来越丰富的情况下,为了高效、灵活的使用资源,以及在使用时的资源隔离,把硬件资源抽象成软件资源…

机器学习第一课

实现流程: 数据输入->数据基本处理->特征工程->训练->模型评估->新数据输入->预测结果 数据类型: 类型一:特征值目标值 类型二:只有特征值 一、数据基本处理 达到的标准 二、特征工程 三、机器学习&#…

Java+Swing+mysql图书管理系统

JavaSwingmysql图书管理系统 一、系统介绍二、功能展示1.管理员登陆2.图书查询3.图书入库4.借书5.还书6.图书证管理 三、系统实现1.BookManageMainFrame.java 四、其它1.其他系统实现2.获取源码 一、系统介绍 该系统实现了 用户: 书籍查询,借书,还书功能…

本地serve跑vue或者react打包后的项目

本地跑vue或者react打包后的项目 不需要本地服务器跑打包后的build文件夹(也可能是 dist文件夹)项目。 一般方案: 方案一:本地电脑运行serve服务(本文~~)方案二:vscode编辑器安装拓展【live …

KEGG注释:KEGG富集可视化柱状图

很久很久以前,看到过文章中的KEGG富集可视化结果图。是对KEGG通路进行注释的。后来在一些测序公司的宣传页上也见到过类似的图: image.png image.png 其实这个图就是多了一个KEGG通路注释,近期也有小伙伴寻求怎么做。网上很多在线工具可以完…

第二节 柱状图

文章目录 1.数据分析流程图2. 列表与数组2.1 二者区别2.2 shape() 函数2.3 生成柱状图比较2.3.1 列表生成柱状图2.3.2 数组生成柱状图2.3.3 扩展案例练习 3. 坐标值3.1 添加横纵坐标值 4. 其他优化细节4.1 屏幕属性4.2 标题属性4.3 练习案例 5. 知识点总结 1.数据分析流程图 数…

功率放大器的工作原理及特点是什么

功率放大器是一种电子设备,用于将输入信号放大到更大的电压、电流或功率级别,以便驱动更大的负载或产生更大的输出功率。这种类型的放大器常用于音频、无线电通信、雷达、声呐、医疗设备和其他应用中。下面安泰电子将为大家介绍功率放大器的工作原理及特…

糖基化修饰:130548-92-4,Fmoc-L-Thr(Ac4-D-Glcβ)-OH,糖肽按照氨基酸和糖的连接方式分为多种

Fmoc-L-Thr(Ac4-D-Glcβ)-OH,糖基化修饰,即糖肽可以按照氨基酸和糖的连接方式分为四类:O 位糖基化、N 位糖基化,糖肽的基本结构多肽链与糖链通过共价键相连蛋白链上连接糖链的位点称为糖基化位点。由于糖肽糖链的生物合成没有模板…

重磅再推 | 基于OpenSearch向量检索版+大模型,搭建对话式搜索

面向企业开发者的PaaS方案 一周前,阿里云OpenSearch发布的LLM智能问答版,面向行业搜索场景,提供企业专属问答搜索服务。作为一站式免运维的SaaS服务,智能问答版基于内置的LLM大模型提供问答能力,为企业快速搭建问答搜…

Linux系统安装mysql8完整无脑步骤

1:卸载原有REPO源 查询已经存在的mysql及相关依赖包 rpm -qa | grep mysql此时你会看到一堆列表,使用 yum 命令依次卸载 yum remove mysql-xxx-xxx-xxx接下来删除 mysql 的残留目录及文件,先用下面的命令找出所有mysql相关的文件夹 find …

报表工具Stimulsoft Reports用户手册:如何激活控件

Stimulsoft Reports.Net是一个基于.NET框架的报表生成器,能够帮助你创建结构、功能丰富的报表。StimulReport.Net 的报表设计器不仅界面友好,而且使用便捷,能够让你轻松创建所有报表;该报表设计器在报表设计过程中以及报表运行的过…

WhoNet报不是有效dbf解决

由于现在Web已经部署到Linux上了,以前在Windows上导出dbf通过oledb执行sql生成dbf的路径已经不可用了,加上需要安装dataaccess驱动也麻烦,为此换了fastdbf生成dbf文件。 首先还算顺利,开始就碰到中文乱码问题,下载源码…

Qt学习之旅 - QTableWidget控件其他控件设置图标

文章目录 设置列数设置水平表头设置行数设置正文设置QTableWidget表格不可被选中、不可编辑设置表格中某个单元格不可被选中 防止越界int转QString其他控件Scroll Area按键 添加UI设置图标主窗口图标状态栏上显示图标使用QtCreator //QTableWidget控件 //设置列数 ui->table…

人工智能和传统行业的思考

人工智能和传统行业的思考 转载:原文链接 — https://xiaowenz.com/blog/2023/04/decouple-your-time/ 传统之传统 传统产业之所以被称为传统,除了大部分并非依靠计算机技术驱动之外,同时也因为这些产业往往更贴近社会的基础架构或生产要素…

常见中间件

中间件简介 中间件运行在系统软件和应用软件之间,以便于各部件之间的沟通。他充当的功能是:将应用程序运行环境与操作系统隔离,从而让开发者不必为更多系统问题忧虑,直接关注该应用程序在解决问题上的能力。 提供解析网站代码的一…

STM32ARM体系结构(嵌入式学习)

STM32&ARM体系结构 1. STM321.1 简介1.2 STM32的优势1.3 命名规范 2. ARM体系结构2.1 ARM体系结构面试题:谈谈你对ARM的认识?1.ARM公司2.ARM处理器3.ARM技术 目前主流处理器架构?精简指令集RISC和复杂指令集CISC的区别?精简指…

第二类曲线积分

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 第二类曲线积分一、向量场是什么?二、向量场可视化三、计算1. 计算方式一2. 计算方式二 第二类曲线积分 因为之前学习第二类曲线的时候,不是…

CarEye 视频平台解决方案

前言 随着4G,5G技术和互联网技术的普及,流媒体应用越来越广发应用到生活中。本文档主要介绍CarEye视频服务器的主要软件硬件构成,功能实现。 功能介绍 CarEye 媒体服务器主要实现以下基本功能: 遵照GB28181/GT1078协议实设备到…