Android使用Intent传递组件大数据
作者:? 发布时间:2023-09-30 12:21:46
数据传输
在Android开发过程中,我们常常通过Intent在各个组件之间传递数据。例如在使用startActivity(android.content.Intent)
方法启动新的 Activity 时,我们就可以通过创建Intent
对象然后调用putExtra()
方法传输参数。
val intent = Intent(this, TestActivity::class.java)
intent.putExtra("name","name")
startActivity(intent)
启动完新的Activity之后,我们可以在新的Activity获取传输的数据。
val name = getIntent().getStringExtra("name")
一般情况下,我们传递的数据都是很小的数据,但是有时候我们想传输一个大对象,比如bitmap,就有可能出现问题。
val intent = Intent(this, TestActivity::class.java)
val data= ByteArray( 1024 * 1024)
intent.putExtra("param",data)
startActivity(intent)
当调用该方法启动新的Activity的时候就会抛出异常。
android.os.TransactionTooLargeException: data parcel size 1048920 bytes
很明显,出错的原因是我们传输的数据量太大了。在官方文档中有这样的描述:
The Binder transaction buffer has a limited fixed size, currently 1Mb, which is shared by all transactions in progress for the process. Consequently this exception can be thrown when there are many transactions in progress even when most of the individual transactions are of moderate size。
即缓冲区最大1MB,并且这是该进程中所有正在进行中的传输对象所公用的。所以我们能传输的数据大小实际上应该比1M要小。
替代方案
我们可以通过静态变量来共享数据
使用
bundle.putBinder()
方法完成大数据传递。
由于我们要将数据存放在Binder里面,所以先创建一个类继承自Binder。data就是我们传递的数据对象。
class BigBinder(val data: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",bundle)
startActivity(intent)
然后正常启动新界面,发现可以跳转过去,而且新界面也可以接收到我们传递的数据。
为什么通过这种方式就可以绕过1M的缓冲区限制呢,这是因为直接通过Intent传递的时候,系统采用的是拷贝到缓冲区的方式,而通过putBinder的方式则是利用共享内存,而共享内存的限制远远大于1M,所以不会出现异常。
来源:https://juejin.cn/post/7109862936604049415


猜你喜欢
- 一、背景当我们在drools中编写规则时,有些时候存在重复的代码,那么我们是否可以将这些重复代码抽取出来,封装成一个function来调用呢
- 本文实例讲述了JAVA中AES加密方法。分享给大家供大家参考。具体如下:java代码:KeyGenerator kg = KeyGenera
- 本文实例为大家分享了Android自定义view实现TextView方形输入框的具体代码,供大家参考,具体内容如下先奉上最终效果图实现思路分
- SpringMVC的数据响应SpringMVC的数据响应方式①页面跳转直接返回字符串(如在一个方法中,return了一个"xxx.
- SpringMVC * path路径的坑SpringMVC提供了很方便的 * 供我们开发使用。在配置文件中通过<mvc:mapping
- 内存泄露内存泄漏就是在当前应用周期内不再使用的对象被GC Roots引用,导致不能回收,使实际可使用内存变小,通俗点讲,就是无法回收无用对象
- 随着Android设备增多,不少网站都开始设备Android设备,而Android主流设备类型以手机和平板为主。网站在适配时通过User A
- 判断JSONObject是否存在某个KeyJSONObject jsonObj = new JSONObject();jsonObj.put
- 前言前段时间看到了豆瓣FM的音乐播放界面,有一个环形的进度条,非常的好看,于是想了想,为什么不自己做一个呢,于是就开始了自定义的过程豆瓣FM
- 趁着过年这段时间,我将算法导论这本书看了一遍,感觉受益匪浅。着这里也根据算法导论中所涉及到的算法用java实现了一遍。第一篇我们就从排序开始
- 前言:文件的上传和下载在日常开发中很是常见,那么这一功能是如何实现的呢,下面我给大家介绍一下实现条件:1、需要一个form标签,method
- 本文实例为大家分享了C#实现简单打字小游戏的具体代码,供大家参考,具体内容如下using System;using System.Colle
- Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制。
- 限时抢购倒计时实现效果图布局:<LinearLayout android:id="@+id/ll_
- Spring @Async无法实现异步问题原因项目中存在2个配置文件:springMVC.xml和beanDefines.xml,它们都配置
- 综合案例开发:模拟双色 * 票游戏,供大家参考,具体内容如下玩法说明:双色球投注区分为红球号码区和蓝球号码区,红球号码范围为01~33,蓝球号
- 最近正式入坑Flutter,首先从环境搭建开始,看了网上好多关于Windows环境搭建的资料,基本都是按官方文档写的,看完的感受是,还不如直
- 源程序揭秘杨辉三角形性质: 每行数字左右对称,由 1 开始逐渐变大,然后变小,回到 1。 第 n 行的数字个数为 n 个。 第 n 行数字和
- 在使用WPF开发的时候就不免会遇到需要两个窗口间进行传值操作,当然多窗口间传值的方法有很多种,本文介绍的是使用委托实现多窗口间的传值。在上代
- 希尔排序是插入排序的一种,又称"缩小增量排序”,是插入排序算法的一种更高效的改进版本。希尔排序原理1.选定一个增长量h,按照增长量