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
猜你喜欢
- 这篇文章主要介绍了Java多线程状态及方法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 描述输入一行字符串,分别统计出其中英文字母、空格、数字和其它字符的个数输入描述:控制台随机输入一串字符串输出描述:输出字符串中包含的英文字母
- 本示例采用基姆拉尔森计算公式来根据日期计算未来日子是星期几:首先看下百度百科的基姆拉尔森计算公式定义:基姆拉尔森计算公式W= (d+2*m+
- c#数据绑定之将datatabel的data添加listView中,简要的通过代码应用了DataTable,DataTableColumns
- 在分支较多的时候,switch的效率比if高,在反汇编中我们即可看到效率高的原因一、switch语句1、在正向编码时,switch语句可以看
- 一、自动装配1、四种类型的自动装配类型解释xml 配置byName根据 Bean 的 name 或者 id<bean id=”bean
- 什么是流?流:程序和设备之间连接起来的一根用于数据传输的管道,流就是一根管道。流的分类:四大基本抽象流(输入流,输出流,字符流,字节流)文件
- 前言各位小伙伴大家好,我是A哥。IDEA上个较大版本的发布,要追溯到4月份了:时隔近4个月,北京时间2020-07-28深夜,Intelli
- 该文章中使用了较多的 委托delegate和Lambda表达式,如果你并不熟悉这些,请查看我的文章《委托与匿名委托》、《匿名委托与Lambd
- idea2020.3.3配置Maven走过的那些坑idea2021最新激活码idea2020.3.3激活码有两种方法,小编在这推荐使用方法一
- 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下实现思路:首先说下布局,整个是一个横向的线性
- 导入Jstl标签库<%@ taglib uri="http://java.sun.com/jsp/jstl/core&quo
- 背景介绍1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆
- 一、JMeter后端 * 介绍说到JMeter后端 * ,必须要从源头BackendListener开始说,最后延伸到我们需要的Backen
- RFC6749OAuth2的官方文档在RFC6749:https://datatracker.ietf.org/doc/html/rfc67
- 文章来源:csdn 作者:chensheng913对于Java语言,最体贴的一项设计就是它并没有打算让人们为了写程序而写程序——人们也需要考
- 详解Android Webview加载网页时发送HTTP头信息当你点击一个超链接进行跳转时,WebView会自动将当前地址作为Referer
- 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码。反射就是把Java类中的各个成员映射成一个个的Java对象。即在运行状态中,对于
- JDK * :利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。CGlib * :利用AS
- 1.使用多线程的几种方式(1)不需要传递参数,也不需要返回参数ThreadStart是一个委托,这个委托的定义为void ThreadSta