download:尚硅谷大数据2022年4月开班最新
数据传输
在Android开发过程中,我们经常通过意图在各个组件之间传递数据。例如,当使用start Activity(Android . content . Intent)方法开始一个新的活动时,我们可以创建一个intent对象,然后调用putExtra()方法来传递参数。
val intent = Intent(this,TestActivity::class.java)
intent.putExtra("name "," name ")
开始活动(意图)
复制代码
开始新活动后,我们可以在新活动中获取传输的数据。
val name = getIntent()。getStringExtra("name ")
复制代码
一般来说,我们传输的数据是很小的,但是有时候我们想传输一个很大的对象,比如位图,可能会有问题。
val intent = Intent(this,TestActivity::class.java)
val data= https://www.it610.com/article/ByteArray( 1024 * 1024)
intent.putExtra("param ",data)
开始活动(意图)
复制代码
当调用此方法来启动新的活动时,将会引发异常。
Android . OS . transactiontoolargeexception:数据包大小1048920字节
复制代码
很明显,错误的原因是我们传输的数据量太大了。官方文件中有这样的描述:
【尚硅谷大数据2022年4月开班最新】Binder事务缓冲区有一个有限的固定大小,目前为1Mb,由进程中的所有事务共享。因此,当有许多事务正在进行时,即使大多数单个事务的大小适中,也会抛出这个异常。
也就是说,最大缓冲区大小是1MB,这对于该进程中所有正在进行的传输对象是通用的。因此,我们可以传输的数据大小实际上应该小于1M。
比较方案
我们可以通过静态变量来共享数据。
使用bundle.putBinder()方法完成大数据传输。
因为我们希望将数据存储在活页夹中,所以我们首先创建一个类来继承活页夹。数据是我们传递的数据对象。
类BigBinder(val数据:ByteArray):Binder()
复制代码
那就通过。
val intent = Intent(this,TestActivity::class.java)
val data= https://www.it610.com/article/ByteArray( 1024 * 1024)
val bundle = Bundle()
val bigData = BigBinder(data)
bundle.putBinder("bigData ",bigData)
intent.putExtra("bundle ",捆绑)
开始活动(意图)
复制代码
然后正常启动新接口,发现可以跳过去,新接口也可以接收我们传过去的数据。
为什么可以这样绕过1M缓冲的限制?这是因为系统在直接通过Intent传递时使用的是复制到缓冲区的方式,而
putBinder
的方式使用的是共享内存,共享内存的限制远大于1M,所以不会出现异常。推荐阅读
- 体系课-大数据工程师2022版2.0升级版无密
- 体系课大数据工程师2022版2.0升级版含源码ppt
- 运维|【云周刊】第132期(走近40+世界级AI专家!第三届中国人工智能大会资料分享...)
- kafka|Kafka详细教程-及热点面试题
- 华数杯|2022华数杯数学建模思路分析交流
- 机器学习|2021年华为杯数学建模比赛——二分类与回归问题(1)
- 单细胞系列|SCS【4】单细胞转录组数据可视化分析 (Seurat 4.0)
- 单细胞系列|SCS【3】单细胞转录组数据 GEO 下载及读取
- ui|Spring Boot 揭秘与实战