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,所以不会出现异常。