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

news2024/11/19 5:35:20

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.launch

class MainActivity : AppCompatActivity() {
    private val TAG = "fly"

    private val KEY = "key"
    private var mBitmap: Bitmap? = null

    override 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? = null

        constructor(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.coloradmin.cn/o/1514662.html

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

相关文章

【Node.js从基础到高级运用】十、Node.js中的数据库操作

简介 MongoDB 是一种非关系型数据库(NoSQL),它以其灵活的文档结构、高性能、高可用性、易扩展性而闻名。对于许多Node.js开发人员来说,MongoDB 是后端存储的首选解决方案,因为它可以存储的 JSON-like 文档与 JavaScri…

关于Oracle Primavera P6的各数据库帐号用途

在使用/维护P6时,经常会用到各种不同的P6数据库用户,如在连接配置P6 Professional时用到的公共帐号pubuser,进入后台维护p6配置信息(adminpv)或开发常连接的privuser,亦或是配置BI Report/BUSINESS Intelligence报表套件用到的pxr…

如何“使用Docker快速安装Jenkins,在CentOS7”?

1、运行 docker run -d --namejenkins -p 8080:8080 jenkins/jenkins 2、查看日志 ,使用 "docker logs -f jenkins",可以持续刷新日志 docker logs jenkins 3、通过命令查看密码 docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminP…

【热门话题】前端框架发展史

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 前端开发的历史演变引言第一章:起源与基础建设 - HTML与CSS时代1.1 …

学习网络安全:记一次某网站渗透测试过程

本文作者: 汇智知了堂信安教学老师——辉哥 一、信息收集 网站界面 网站信息收集 (1)中间件信息 (2)目录扫描 思路:由于是cms的站,针对这种情况,我们可以收集cms的默认目录结构来…

《如何使用C语言去下三子棋?》

目录 一、环境配置 二、功能模块 1.打印菜单 2.初始化并打印棋盘 3、行棋 3.1玩家行棋 3.2电脑行棋 4、判断是否和棋 5.判赢 三、代码实现 1、test.c文件 2、game.c文件 3、game.h文件 一、环境配置 本游戏用到三个文件,分别是两个源文件test.c game.c 和…

【STL】stack栈容器与list链表容器

1.栈stack 栈具有先进后出的特性,最先进入的数据压在最底下,最后出来 2.list链表容器 list链表容器是一种双向链表,两端都可插入与删除,是双向访问迭代器,与vertor随机访问迭代器有不同的区别 reverse(&…

设计模式 — — 单例模式

一、是什么 单例模式只会在全局作用域下创建一次实例对象,让所有需要调用的地方都共享这一单例对象 二、实现 // 单例构造函数 function CreateSingleton (name) {this.name name;this.getName(); };// 获取实例的名字 CreateSingleton.prototype.getName func…

torch.backends.cudnn.benchmark 作用

相关参数 torch.backends.cudnn.enabled torch.backends.cudnn.benchmark torch.backends.cudnn.deterministictorch.backends.cudnn.benchmark True:将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法&#xff0c…

2024最新修复版独立付费进群系统源码全开源

1、修复SQL表 2、修复支付文件 3、修复支付图标不显示 4、修复定位、分销逻辑、抽成逻辑 5、新增支持源支付、易支付的支付接口 6、修复官方微信、支付宝支付接口文件 本来早就可以完工的,被99ai群里的几个傻逼耽搁了,做好自己就行了,这…

腾讯云轻量服务器地域怎么选择?上海/北京/广州哪个合适?

腾讯云轻量应用服务器地域如何选择?地域就近选择,北方选北京地域、南方选广州地域,华东地区选上海地域。广州上海北京地域有什么区别?哪个好?区别就是城市地理位置不同,其他的差不多,不区分好坏…

【Oracle】ORA-00936: 缺失表达式

ORA-00936: 缺失表达式 in 后面 拼接参数无数据会引起 ORA-00936: 缺失表达式。 若from前存在逗号,语法不规范会引起 ORA-00936: 缺失表达式。 数据类型不匹配,若在日期的选择上,要求输入字符串型(varchar2)&#xff0…

为什么 VSCode 不用 Qt 而要用 Electron?

为什么 VSCode 不用 Qt 而要用 Electron? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「Qt 的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!&am…

SSA-LSTM多输入回归预测 | 樽海鞘优化算法-长短期神经网络 | Matlab

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&am…

【C语言】字符串函数上

👑个人主页:啊Q闻 🎇收录专栏:《C语言》 🎉道阻且长,行则将至 前言 这篇博客是字符串函数上篇,主要是关于长度不受限制的字符串函数(strlen,strcpy,strcat,strcm…

React路由结合Material UI的ListItemButton组件完成导航示例

React路由结合Material UI的ListItemButton组件完成导航示例 1、创建菜单列表NavigationList.jsx2、App.js 1、创建菜单列表NavigationList.jsx import React from react; import { ListItemButton, ListItemText, List } from mui/material; import { NavLink as RouterLink …

【GIT】使用Vscode同步git仓库,错误和解决方法记录

这里写目录标题 命令行操作仓库常见命令1 报错“在签出前,请清理存储库工作树。”2 报错“fatal: unable to access https://github.com/...: OpenSSL SSL_read: Connection was reset, errno 10054”3 报错“fatal: bad boolean config value “false” for http.s…

(黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

(黑马出品_高级篇_01)SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——保护 今日目标1.初识Sentinel1.1.雪崩问题及解决方案1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.…

Purple Pi OH鸿蒙开发板7天入门OpenHarmony开源鸿蒙教程【六】

今天我们来从OpenHarmony简介、环境搭建、创建第一个OpenHarmony项目等方面开始OpenHarmony应用开发的第一步。 一. OpenHarmony简介 OpenHarmony 是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能…

今天我们来学习一下关于MySQL数据库

目录 前言: 1.MySQL定义: 1.1基础概念: 1.1.1数据库(Database): 1.1.2表(Table): 1.1.3记录(Record)与字段(Field): …