android.os.TransactionTooLargeException解决方案,Kotlin

android.os.TransactionTooLargeException解决方案,Kotlin

 

首先,特意制造一个让Android发生TransactionTooLargeException的场景,一个Activity启动另外一个Activity,在Intent的Bundle里面塞入一个大的ArrayList:

import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.nio.charset.Charsetclass MainActivity : AppCompatActivity() {companion object {const val MY_KEY = "my_key"const val MY_BUNDLE = "my_bundle"}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val ctx = thisCoroutineScope(Dispatchers.IO).launch {val bytes = "z".toByteArray(Charset.defaultCharset())val count = 1024 * 1024val list = arrayListOf<ByteArray>()for (i in 0..count) {list.add(bytes)}val bundle = Bundle()bundle.putSerializable(MY_KEY, list)CoroutineScope(Dispatchers.Main).launch {val intent = Intent(ctx, MyTestActivity::class.java)intent.putExtra(MY_BUNDLE, bundle)startActivity(intent)}}}
}

 

被启动的MyTestActivity:

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivityclass MyTestActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val bundle = intent.getBundleExtra(MainActivity.MY_BUNDLE)Log.d("fly", "MyTestActivity onCreate size=${bundle?.getSerializable(MainActivity.MY_KEY, ArrayList::class.java)?.size}")}
}

 

 

MainActivity运行起来后,应用直接崩溃抛错:

877d20f670dc4ae08042fe7936413e95.png

 

!!! FAILED BINDER TRANSACTION !!!  (parcel size = 12583376) 

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

因为Bundle传输的数据总量大小不能超过1MB,且应用内的Activity/Frgment共享这1MB。

 

解决方案

两边改造,换用Binder,参考( Android Bundle putBinder传输超过1MB数据,Kotlin-CSDN博客 ):

 

import android.content.Intent
import android.os.Binder
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.nio.charset.Charsetclass MainActivity : AppCompatActivity() {companion object {const val MY_KEY = "my_key"const val MY_BUNDLE = "my_bundle"}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val ctx = thisCoroutineScope(Dispatchers.IO).launch {val bytes = "z".toByteArray(Charset.defaultCharset())val count = 1024 * 1024val list = arrayListOf<ByteArray>()for (i in 0..count) {list.add(bytes)}val bundle = Bundle()bundle.putBinder(MY_KEY, MyBinder(list))CoroutineScope(Dispatchers.Main).launch {val intent = Intent(ctx, MyTestActivity::class.java)intent.putExtra(MY_BUNDLE, bundle)startActivity(intent)}}}
}class MyBinder : Binder {private var data: ArrayList<ByteArray>? = nullconstructor(data: ArrayList<ByteArray>?) {this.data = data}fun getData(): ArrayList<ByteArray>? {return data}
}

 

 

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivityclass MyTestActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val bundle = intent.getBundleExtra(MainActivity.MY_BUNDLE)val binder = bundle?.getBinder(MainActivity.MY_KEY) as MyBinderLog.d("fly", "MyTestActivity onCreate size=${binder.getData()?.size}")}
}

 

MainActivity启动后,MyTestActivity成功收到通过Bundle传输的超大数据集:

5e4503672928477aaa72e687569475a9.png

 

 

 

Android TransactionTooLargeException排查定位-CSDN博客文章浏览阅读724次,点赞10次,收藏20次。文章浏览阅读422次。文章浏览阅读5.5k次。本文作者:Zhang Phil原文链接:Android Activity生命周期以及onSaveInstanceState、onRestoreInstanceState要点备忘一般的,当Android activity的生命周期进入onPause后,Android系统紧接着就要回调:protected void onSaveInstanceState_activity生命周期 onsaveinstane。https://blog.csdn.net/zhangphil/article/details/136745278

 

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

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

相关文章

Flutter学习10 - Json解析与Model使用

对于网络请求返回的 Json 数据&#xff0c;一般会进行如下解析&#xff1a; 将 Json String 解析为 Map<String, dynamic>将 Json String 解析为 Dart Model 发起一个返回 Json String 的网络请求 import package:http/http.dart as http;void main() {_doGet(); }_do…

【LeetCode】升级打怪之路 Day 26:回溯算法 — 集合划分问题

今日题目&#xff1a; 698. 划分为k个相等的子集 | LeetCode473. 火柴拼正方形 | LeetCode 参考文章&#xff1a; 经典回溯算法&#xff1a;集合划分问题 目录 LC 698. 划分为k个相等的子集 【classic&#xff0c;有难度】数据预处理&#xff1a;计算 target基本回溯优化 1&…

【计算机网络】常见面试题汇总

文章目录 1.计算机网络基础1.1网络分层模型/OSI七层模型是什么&#xff1f;1.2TCP/IP四层模型是什么&#xff1f;每一层的作用&#xff1f;1.2.1TCP四层模型&#xff1f;1.2.2为什么网络要分层&#xff1f; 1.2常见网络协议1.2.1应用层常见的协议1.2.2网络层常见的协议 2.HTTP2…

opencv 十八 python下实现0缓存掉线重连的rtsp直播流播放器

使用opencv打开rtsp视频流时&#xff0c;会因为网络问题导致VideoCapture掉线&#xff1b;也会因为图像的后处理阶段耗时过长导致opencv缓冲区数据堆积&#xff0c;从而使程序无法及时处理最新的数据。为此对cv2.VideoCapture进行封装&#xff0c;实现0缓存掉线重连的rtsp直播流…

亚马逊云科技:企业如何开启生成式AI之旅?

如果要评选最近两年全球科技行业最热门的细分领域&#xff0c;那么生成式AI绝对会以遥遥领先的票数成为当仁不让的冠军。 然而眼见生成式AI发展得如火如荼&#xff0c;越来越多的企业却陷入了深深的焦虑&#xff1a;应该如何开启生成式AI之旅&#xff1f;又该怎样搭建大模型&am…

鸿蒙Harmony应用开发—ArkTS-像素单位

ArkUI为开发者提供4种像素单位&#xff0c;框架采用vp为基准数据单位。 说明&#xff1a; 本模块首批接口从API version 7开始支持&#xff0c;后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 名称描述px屏幕物理像素单位。vp屏幕密度相关像素&#xff0c;…

Vue使用font-face自定义字体详解

目录 1 介绍2 使用2.1 语法2.2 属性说明2.3 Vue使用案例2.3.1 全局定义字体2.3.2 在页面使用 3 注意事项 1 介绍 font-face 是 CSS 中的一个规则&#xff0c;它允许你加载服务器上的字体文件&#xff08;远程或者本地&#xff09;&#xff0c;并在网页中使用这些字体。这样&am…

基于python+vue电影院订票信息管理系统flask-django-php-nodejs

根据此问题&#xff0c;研发一套电影院订票信息管理系统&#xff0c;既能够大大提高信息的检索、变更与维护的工作效率&#xff0c;也能够方便信息系统的管理运用&#xff0c;从而减少信息管理成本&#xff0c;提高效率。 该电影院订票信息管理系统采用B/S架构、前后端分离以及…

查立得php+mysql源码通用数据库配置教程

适用范围&#xff1a; 查分吧PHP多条件都输对版已有表万用查询系统 phpMySql已有数据表通用搜索可增删改查 查立得快搜系统(phpMysql) v20220208 查立得万能查&#xff08;phpmysql&#xff09; v20220512 及 各付费版 等几十款源码 数据库配置路径 数…

阿里云服务器(Ubuntu22)上的MySQL8数据库下载,安装和远程连接

最近阿里云centos主机到期了改为使用Ubuntu操作系统&#xff0c;在上面安装mysql并远程连接出现了一系列问题并解决。 之前在centos系统上下载mysql8的教程如下&#xff1a; 阿里云服务器&#xff08;centos7&#xff09;上的MySQL8数据库下载&#xff0c;安装和远程连接 主机操…

Qt打开已有工程方法

在Qt中&#xff0c;对于一个已有工程如何进行打开&#xff1f; 1、首先打开Qt Creator 2、点击文件->打开文件或项目&#xff0c;找到对应文件夹下的.pro文件并打开 3、点击配置工程 这样就打开对应的Qt项目了&#xff0c;点击运行即可看到对应的效果 Qt开发涉及界面修饰…

图床项目实战:后续开发与优化

在之前的文章中&#xff0c;我们介绍了图床项目的基本实现&#xff0c;接下来&#xff0c;我将提供扩展功能和优化性能的关键代码片段。 一、图片分类管理 首先&#xff0c;我们需要在数据库中创建分类表&#xff0c;并在图片表中添加分类字段。 class Category(db.Model): …