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= ByteArray(1024 * 1024)
intent.putExtra("param",data)
开始流动 (用意)
复制代码
当调用此办法来启动新的流动时,将会引发异样。
Android . OS . transactiontoolargeexception: 数据包大小 1048920 字节
复制代码
很显著,谬误的起因是咱们传输的数据量太大了。官网文件中有这样的形容:
Binder 事务缓冲区有一个无限的固定大小,目前为 1Mb,由过程中的所有事务共享。因而,当有许多事务正在进行时,即便大多数单个事务的大小适中,也会抛出这个异样。
也就是说,最大缓冲区大小是 1MB,这对于该过程中所有正在进行的传输对象是通用的。因而,咱们能够传输的数据大小实际上应该小于 1M。
比拟计划
咱们能够通过动态变量来共享数据。
应用 bundle.putBinder()办法实现大数据传输。
因为咱们心愿将数据存储在活页夹中,所以咱们首先创立一个类来继承活页夹。数据是咱们传递的数据对象。
类 BigBinder(val 数据:ByteArray):Binder()
复制代码
那就通过。val intent = Intent(this,TestActivity::class.java)
val data= ByteArray(1024 * 1024)
val bundle = Bundle()
val bigData = BigBinder(data)
bundle.putBinder("bigData",bigData)
intent.putExtra("bundle",捆绑)
开始流动(用意)
复制代码
而后失常启动新接口,发现能够跳过去,新接口也能够接管咱们传过来的数据。
为什么能够这样绕过 1M 缓冲的限度?这是因为零碎在间接通过 Intent 传递时应用的是复制到缓冲区的形式,而 putBinder
的形式应用的是共享内存,共享内存的限度远大于 1M,所以不会出现异常。