尚硅谷大数据2022年4月开班最新

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

你可能感兴趣的:(大数据)