Android Bundle putBinder传输超过1MB数据,Kotlin

Android Bundle putBinder传输超过1MB数据,Kotlin

由于Android系统架构的设计,Activity/Fragment之间通过Intent在Bundle塞进数据进行传输时候,如果数据超过1MB,会抛JE:

java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size xxxxxxx bytes

关于TransactionTooLargeException:

The Binder transaction failed because it was too large. During a remote procedure call, the arguments and the return value of the call are transferred as Parcel objects stored in the Binder transaction buffer. If the arguments or the return value are too large to fit in the transaction buffer, then the call will fail and TransactionTooLargeException will be thrown. 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.

但是新版Android系统可用通过在Bundle里面的putBinder传输超过1MB的数据,甚至直接可用传递更大的Bitmap:

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.Binder
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launchclass MainActivity : AppCompatActivity() {private val TAG = "fly"private val KEY = "key"private var mBitmap: Bitmap? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)Log.d(TAG, "onCreate savedInstanceState=${savedInstanceState?.size()}")val bmp = (savedInstanceState?.getBinder(KEY) as? MyBinder)?.getBitmap()if (bmp != null) {Log.d(TAG, "onCreate bmp != null bmp=${bmp.byteCount}")mBitmap = bmp} else {lifecycleScope.launch(Dispatchers.IO) {mBitmap = BitmapFactory.decodeResource(resources, R.mipmap.p4m)Log.d(TAG, "mBitmap=${mBitmap?.byteCount}")}}}override fun onDestroy() {super.onDestroy()Log.d(TAG, "onDestroy")}override fun onSaveInstanceState(outState: Bundle) {super.onSaveInstanceState(outState)Log.d(TAG, "onSaveInstanceState outState=${outState.size()}")outState.putBinder(KEY, MyBinder(mBitmap!!))Log.d(TAG, "onSaveInstanceState putBinder outState=${outState.size()}")}override fun onRestoreInstanceState(savedInstanceState: Bundle) {super.onRestoreInstanceState(savedInstanceState)Log.d(TAG, "onRestoreInstanceState outState=${savedInstanceState.size()}")val bmp = (savedInstanceState.getBinder(KEY) as? MyBinder)?.getBitmap()Log.d(TAG, "onRestoreInstanceState bmp=${bmp?.byteCount}")}class MyBinder : Binder {private var bitmap: Bitmap? = nullconstructor(bmp: Bitmap) {this.bitmap = bmp}fun getBitmap(): Bitmap? {return bitmap}}
}

Activity启动后:

当切换黑夜模式/深色主题后,当前Activity消耗重建,但Bundle数据会被存储和传输:

而如果在onCreate()里面,清除Bundle,那么就不会再有累积的数据:

savedInstanceState?.clear()

Android切换主题生命周期流程与onSaveInstanceState和onRestoreInstanceState,Kotlin_安卓开发系统切换主题 重走生命周期-CSDN博客文章浏览阅读422次。本文作者:Zhang Phil原文链接:Android Activity生命周期以及onSaveInstanceState、onRestoreInstanceState要点备忘一般的,当Android activity的生命周期进入onPause后,Android系统紧接着就要回调:protected void onSaveInstanceState。Android Fragment生命周期图以及Activity与Fragment生命周期对照图-CSDN博客。_安卓开发系统切换主题 重走生命周期https://blog.csdn.net/zhangphil/article/details/133943450Android Activity生命周期以及onSaveInstanceState、onRestoreInstanceState要点备忘_activity生命周期 onsaveinstane-CSDN博客文章浏览阅读5.5k次。本文作者:Zhang Phil原文链接:Android Activity生命周期以及onSaveInstanceState、onRestoreInstanceState要点备忘一般的,当Android activity的生命周期进入onPause后,Android系统紧接着就要回调:protected void onSaveInstanceState_activity生命周期 onsaveinstanehttps://blog.csdn.net/zhangphil/article/details/48155371

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

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

相关文章

浏览器预览word

浏览器打开word是直接下载,而打开pdf才是预览。所以需要先将word转为pdf,visual basic将word转pdf的代码: Sub word2pdf()ActiveDocument.ExportAsFixedFormat OutputFileName:"C:\Users\zhour\Documents\contact.pdf", ExportFor…

proto的singular解释

在计算机科学和特别是在协议缓冲区(Protocol Buffers,简称Proto)的上下文中,“singular”这个词具有特定的含义。Protocol Buffers是Google开发的一种语言中立、平台中立、可扩展的序列化结构数据的方法,广泛用于通信协…

大型语言模型RAG(检索增强生成):检索技术的应用与挑战

摘要 检索增强生成(RAG)系统通过结合传统的语言模型生成能力和结构化数据检索,为复杂的问题提供精确的答案。本文深入探讨了RAG系统中检索技术的工作原理、实现方式以及面临的挑战,并对未来的发展方向提出了展望。 随着大型预训…

IDEA中配置完Maven后 重启就恢复默认设置

目录 问题描述解决方案-修改other settingsother settings改完也不奏效参考这里 问题描述 在IDEA的settings里配置完Maven之后 每次重启或新建一个项目/窗口之后 又恢复成之前的默认配置 解决方案-修改other settings 这和IDEA的版本有关 目前我使用的版本(2020.3.4) 配置完重…

自监督学习的新前沿:大型模型在自然语言处理中的应用

摘要: 自监督学习的新前沿,特别是大型模型在自然语言处理中的应用,正在引领自然语言处理领域的发展。本文将概述自监督学习的新前沿,特别是大型模型在自然语言处理中的应用,以及其在自然语言处理领域的重要性和应用前…

计算机网络期末98+冲刺笔记

一、计算机网络基础 1.1计算机网络的概述 计算机网络的定义:利用通信设备和线路,将地理位置不同的具有独立功能的多台计算机机器外部设备连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息…

cpp qt 一个奇怪的bug

今天在用cpp qt的时候发现了一个奇怪的东西 这是我的源代码 #include "mywidget.h" #include <QPushButton>myWidget::myWidget(QWidget *parent): QWidget(parent) {QPushButton * btn1 new QPushButton;btn1->show();btn1->setParent(this);btn1-&g…

如何恢复丢失未保存的 Word 文档指南

在广阔的数字领域&#xff0c;对丢失未保存的 Word 文档的恐惧对于用户来说是再熟悉不过的焦虑了。本指南旨在对用户可能发现自己迫切需要恢复未保存文档的各种场景进行详尽的探索。无论是由于保存失败、意外的系统崩溃还是令人心碎的意外删除&#xff0c;请放心&#xff0c;我…

无线业务配置建议

WPA2802.1X的接入方式 对于商用环境应该提供更安全的认证和加密方式&#xff0c; 推荐使用WPA2的AES加密方式&#xff0c;结合安全级别较高的802.1X认证方式&#xff0c;更适合封闭性较高的企业级用户。 # 配置WPA2的AES 802.1X认证方式。 <HUAWEI> system-view [HUAW…

Docker Commit提交

Docker Commit提交 Docker Commit镜像提交 以一个正在运行的tomcat为例因为docker拉取的镜像都是删减版&#xff0c;所以需要将webapp.dist的文件内容复制到webapps中再将自己制作的镜像放在正在运行服务器上&#xff0c;不是云端服务器上 #进入tomcat&#xff0c;这是一个正…

详解MySQL的MVCC(ReadView部分解析C++源码)

文章目录 1. 什么是MVCC2. MVCC核心组成&#xff08;三大件&#xff09;2.1 MVCC为什么需要三大件 3. 隐藏字段4. undo log4.1 模拟版本链数据形成过程 5. Read View5.1 m_ids5.2 m_creator_trx_id5.3 m_low_limit_id5.4 m_up_limit_id5.5 可见性分析算法 6. MVCC流程模拟6.1 R…

ChromeDriver 122 版本为例 国内下载地址及安装教程

ChromeDriver 国内下载地址 https://chromedriver.com/download 靠谱 千千万万别下载错了 先确认 Chrome 浏览器版本 以 win64 版本为例 那我们下载这一个啊&#xff0c;不要下载错了 下载地址贴在这哈 https://storage.googleapis.com/chrome-for-testing-public/122.0.…

GPT-3.5发布:大型语言模型的进化与挑战

摘要&#xff1a; GPT-3.5是OpenAI于2023年发布的一款大型语言模型&#xff0c;它是GPT-3的升级版&#xff0c;拥有1750亿个参数&#xff0c;比GPT-3的参数量增加了近一倍。GPT-3.5在文本生成、对话系统、文本理解等任务上表现出色&#xff0c;其性能已经接近甚至超过了人类水…

机器学习实验------Python机器学习软件包Scikit-Learn的学习与运用

第1关&#xff1a;使用scikit-learn导入数据集 本关任务 本关任务是使用scikit-learn的datasets模块导入iris数据集&#xff0c;并打印前5条原数据、前5条数据标签及原数据的数组大小。 即编程实现step1/importData.py 的getIrisData()函数&#xff1a; from sklearn import…

低代码开发平台,快速搭建开源MES系统

MS低代码云MES作为一家专注于提供生产制造数字化方案的服务商&#xff0c;“以客户为中心”、以“数据驱动、智能化、互联化”为企业的核心标签&#xff0c;以低代码平台为切入点&#xff0c;帮助企业构建以人为本的未来供应链生态系统&#xff0c;实现制造企业的智能化转型。 …

深度复制:C# 中 List 与 List 多层嵌套不改变原值的实现方法

概述&#xff1a;以上内容详细介绍了在 C# 中实现不改变原 List 值的多层嵌套复制方法&#xff0c;包括使用 AutoMapper、Json.NET、以及对象序列化的步骤和示例。这些方法提供了灵活而高效的方式&#xff0c;可以根据项目需求选择最适合的深度复制方式。 1. 使用 AutoMapper …

Vulnhub - Toppo

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog Toppo 靶机下载地址&#xff1a;Toppo: 1 ~ VulnHub 0x01 信息收集 Nmap扫描目标主机&#xff0c;发…

Component和Loader在QML中是紧密相关的两个元素,它们常常一起使用来实现动态加载和实例化QML组件的功能

Component 是一个可重用的QML组件定义&#xff0c;它描述了一个独立的UI元素及其行为。可以将Component看作是一个模板或蓝图&#xff0c;用于创建多个相同类型的QML对象实例。 Loader 是一个特殊的QML元素&#xff0c;用于动态加载和实例化QML组件。它允许您根据需要在运行时…

关于分布式微服务数据源加密配置以及取巧方案(含自定义加密配置)

文章目录 前言Spring Cloud 第一代1、创建config server项目并加入加解密key2、启动项目&#xff0c;进行数据加密3、实际项目中的测试server Spring Cloud Alibaba低版本架构不支持&#xff0c;取巧实现无加密配置&#xff0c;联调环境问题加密数据源配置原理探究自定义加密解…

ubuntu 20.04 Python pip 配置 pip.conf

1. 状况描述 $ pip install timm WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by ProxyError(Cannot connect to proxy., RemoteDisconnected(Remote end closed connection without response)): /simple/t…