Android 巧用putBinder方法传递大文件

  使用Intent传递数据大家都知道,但是如果你使用Intent传递大于1Mb的数据时,就一定会报如下的错误:

Caused by: android.os.TransactionTooLargeException: data parcel size 1049112 bytes

 就是说你的传输数据太大了,当前的大小达到了1049112 bytes。

 下面就给出解决办法,使用putBinder()方法传递大数据,此时使用的是共享内存而不是Binder传输缓存,因此不受1Mb的限制,但是使用该方法也有要注意的点。

 /*** Inserts an {@link IBinder} value into the mapping of this Bundle, replacing* any existing value for the given key.  Either key or value may be null.** <p class="note">You should be very careful when using this function.  In many* places where Bundles are used (such as inside of Intent objects), the Bundle* can live longer inside of another process than the process that had originally* created it.  In that case, the IBinder you supply here will become invalid* when your process goes away, and no longer usable, even if a new process is* created for you later on.</p>** @param key a String, or null* @param value an IBinder object, or null*/public void putBinder(@Nullable String key, @Nullable IBinder value) {unparcel();mMap.put(key, value);}

    意思是说一般情况在进程中利用Bundle传递数据时,Bundle在使用该数据的进程中存活的时间比创建该Bundle的进程中存活的时间要久。但是如果使用putBinder()方式传递数据时,数据在自定义的Binder中,创建Binder的进程一旦不存在,那Binder在使用它的进程中就会变为不可用。这一点在数据流转与取数据的时候一定要小心。


发送方:

package com.openld.seniorstructure.main.testintentbigdataimport android.content.Intent
import android.os.Binder
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatButton
import com.openld.seniorstructure.Rclass TestIntentTransBIgDataActivity : AppCompatActivity() {private lateinit var mBtnFail: AppCompatButtonprivate lateinit var mBtnSuccess: AppCompatButtonoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_test_intent_trans_big_data)initWidgets()addListeners()}private fun initWidgets() {mBtnFail = findViewById(R.id.btn_fail)mBtnSuccess = findViewById(R.id.btn_success)}private fun addListeners() {// 必崩溃mBtnFail.setOnClickListener {val intent = Intent(this,TestIntentTransBigDataResultActivity::class.java)val data = ByteArray(1024 * 1024)val bundle = Bundle()bundle.putByteArray("bigData", data)intent.putExtra("bundle", bundle)startActivity(intent)}// 可以传递大数据mBtnSuccess.setOnClickListener {val intent = Intent(this,TestIntentTransBigDataResultActivity::class.java)val data = ByteArray(1024 * 1024)val bundle = Bundle()val bigData = BigData(ByteArray(1024 * 1024))bundle.putBinder("bigData", bigData)intent.putExtra("bundle", bundle)startActivity(intent)}}
}data class BigData(val byteArray: ByteArray) : Binder() {}

接收方:

package com.openld.seniorstructure.main.testintentbigdataimport android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.openld.seniorstructure.Rclass TestIntentTransBigDataResultActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_test_intent_trans_big_data_result)val bundle = intent.getBundleExtra("bundle")val ba = bundle?.getBinder("bigData") as BigDataToast.makeText(this, "" + ba.byteArray.size / 1024, Toast.LENGTH_SHORT).show()}
}

注意:

上面的用法仅限于单进程,如果需要跨进程传递,必须使用AIDL来实现。

具体实现参考:

Android跨进程传图片或者大数据(解决TransactionTooLargeException)_binder传递bitmap-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/6969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

价值2000元的优质产品经理证书免费考啦(含题库)

小李哥今天带来的的是Pendo家出的2张免费产品经理证书(送Credly徽章&#xff0c;可挂LinkedIn)&#xff0c;原价共计300刀(2000人民币)&#xff0c;使用小李哥文章末尾中的网址可以免费考试&#xff0c;同时小李哥给大家做了题库&#xff0c;欢迎关注小李哥领取&#xff0c;10分…

【个人博客搭建】(17)使用FluentValidation 参数校验

FluentValidation 是一个用于 .NET 的开源验证库&#xff0c;它提供了一种流畅的接口和强类型验证规则&#xff0c;使得验证逻辑表达得更加清晰和简洁。&#xff08;Apache-2.0&#xff09; FluentValidation 的主要作用包括&#xff1a; 提高代码可读性&#xff1a;通过使用 F…

谷歌推广和seo留痕具体怎么操作?

留痕跟谷歌推广其实是一回事&#xff0c;你能在谷歌上留痕&#xff0c;其实就是推广了自己的信息&#xff0c;本质上留痕就是在各大网站留下自己的记录&#xff0c;这个记录可以是品牌信息&#xff0c;联系方式&#xff0c;看你想留下什么 如果要问自己怎么操作&#xff0c;正常…

微信公众号排名 SEO的5个策略

随着微信公众号在社交媒体领域的持续发展和普及&#xff0c;如何提升公众号的搜索排名&#xff0c;成为许多运营者关注的焦点。公众号排名SEO&#xff0c;即针对微信公众号进行搜索引擎优化&#xff0c;旨在提高公众号在搜索结果中的曝光率和点击率。下面&#xff0c;我们将深入…

银行电子凭证技术规范

银行电子凭证技术规范 1 范围 本文件规定了银行电子凭证的文件、数据与样式、系统逻辑框架、生成、通信传输和安全要求&#xff0c;以 及验证方法。 本文件适用于银行电子凭证数据实例与版式文件的开具、传输、接收和应用。 2 规范性引用文件 下列文件中的内容通过文中的规范…

如何复制本地docker镜像到其他主机

&#xff08;1&#xff09;打包镜像 比如我要复制的镜像是grafana的镜像 docker images 这里我把打包的镜像放在了根~目录下&#xff0c;如截图所示&#xff1a; docker save grafana/grafana:latest -o ~/grafana.jar &#xff08;2&#xff09;移动镜像 scp命令拷贝镜像到目标…

标贝数据采集标注在自动驾驶场景中落地应用实例

AI数据服务作为人工智能和机器学习的基础&#xff0c;在自动驾驶领域中有着重要地位。与其他人工智能应用场景相比&#xff0c;自动驾驶的落地场景相对复杂&#xff0c;想要让汽车本身的算法做到处理更多、更复杂的场景&#xff0c;就需要运用大量场景化高质量AI数据做支撑。标…

kafka日志存储

前言 kafka的主题(topic)可以对应多个分区(partition)&#xff0c;而每个分区(partition)可以有多个副本(replica)&#xff0c;我们提生产工单创建topic的时候也是要预设这些参数的。但是它究竟是如何存储的呢&#xff1f;我们在使用kafka发送消息时&#xff0c;实际表现是提交…

tomcat-GC溢出

背景 一个项目需要导出大量的数据&#xff0c;导致GC但是这个项目在本地能够运行&#xff0c;但是在服务器上就不能运行本地和服务器的区别&#xff1a;NGINX和TOMCATGC和NGINX无关&#xff0c;那么就是Tomcat分配JVM的堆内存的容量不够 错误解决思路 网上教了一些查看JVM的大小…

分布式锁与秒杀

分布式锁与秒杀 1. 分布式锁1.1 常用Redis分布式锁方案三&#xff1a;使用Lua脚本(包含SETNX EXPIRE两条指令) 秒杀 1. 分布式锁 https://www.cnblogs.com/shoshana-kong/p/17519673.html 1.1 常用Redis分布式锁方案三&#xff1a;使用Lua脚本(包含SETNX EXPIRE两条指令) …

sql注入基础-2

一、sqlmap工具(kali自带) 1、官网&#xff1a;http://www.sqlmap.org 2、版本查看 python sqlmap.py --version 3、常见命令&#xff1a; -h&#xff1a;查看帮助信息-u "URL" &#xff1a;指定网站-p 参数1,参数2&#xff1a;指定参数 注&#xff1a;-p 只能跟…

力扣141.环形链表142.环形链表Ⅱ 附证明

题目链接&#xff1a; 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 141.环形链表 方法思路&#xff1a;快慢指针 代码: class Solution { public:bool hasCycle(ListNode *head) {if(!head){return fa…

Nodejs内存管[Mark-Sweep算法][Mark-Compact]

内存控制 Mark-Sweep & Mark-Compact 对于老生代的对象&#xff0c;存活对象占较大的比重&#xff0c;采用scvenge方法会存在如下问题 1. 存活对象较多&#xff0c;复制存活对象的效率很低 2. 浪费一半空间的问题因此v8在老生代中主要采用了Mark-Sweep和Mark-Compact相结…

【跟马少平老师学AI】-【神经网络是怎么实现的】(四)卷积神经网络

一句话归纳&#xff1a; 1&#xff09;用1个小粒度的模式&#xff0c;逐个与图像的局部区域进行运算&#xff0c;运算结果反映模式与区域的匹配程度。 2&#xff09;卷积神经网络与全连接神经网络的区别&#xff1a; 卷积神经网络的输出只与局部输入有连接。参数较少&#xff0…

五款优秀的局域网监控软件推荐:实时监控电脑屏幕的神器

在现代社会&#xff0c;计算机和网络已经成为工作中不可或缺的部分。随着局域网的普及&#xff0c;如何有效地监控和管理局域网内的电脑成为了许多企业和管理者关心的问题。本文将为您推荐五款优秀的局域网监控软件&#xff0c;帮助您实时监控电脑屏幕&#xff0c;提高工作效率…

2023陇剑杯-流量分析篇-wp

1.ez_web Q1:服务器自带的后门文件是什么&#xff1f; 常用http过滤命令&#xff1a;http.request.full_urihttp.request.methodPOST 查看第一个POST请求&#xff0c;发现关键点file_put_contents&#xff08;备注&#xff1a;file_put_contents内置函数&#xff0c;用于将字…

访学/博后/联培博士关注|不同国家的英语口音辨识度训练

在访问学者、博士后及联合培养的申请过程中&#xff0c;接收方多数都要求英文面试。如果导师的母语为非英语国家&#xff0c;将会带有口音&#xff0c;这样更增加了英语面试难度。如何提升不同国家的英语口音辨识度&#xff0c;使自己的英语表达更加流利&#xff0c;知识人网小…

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记13 - STM32的SDIO学习5 - 卡的轮询读写擦

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记13 - STM32的SDIO学习5 - 卡的轮询读写擦 一、前情提要二、目标三、技术方案3.1 读写擦的操作3.1.1 读卡操作3.1.2 写卡操作3.1.3 擦除操作 3.2 一些技术点3.2.1 轮询标志位的选择不唯一3.2.2 写和擦的卡状态查询3.2.3 写的速度 四、代…

轨道交通巡检机器人的应用范围

在现代轨道交通系统的庞大网络中&#xff0c;无数的轨道、设备和设施交织在一起&#xff0c;如同一个精密的机器在高效运转。而在这背后&#xff0c;轨道交通巡检机器人正悄然登场&#xff0c;它们如同一个个智能的守护者&#xff0c;穿梭于各个场景之中。那么&#xff0c;这些…

python从0开始学习(三)

目录 前言 1、类型转换 1.1 隐式类型转换 1.2 显式类型转换 2、eval函数 总结 前言 上篇我们讲了python中的变量与常量&#xff0c;以及变量类型。本篇文章将接着往下讲。 1、类型转换 python中的数据类型转换包括两种&#xff1a;隐式类型转换和显式类型转换。 1.1 隐式…