android.os.BadParcelableException: ClassNotFoundException when unmarshalling

错误处理Class not found when unmarshalling: android.support.v4.app.FragmentManagerState 解决方法拉到文末. 报错日志: E/Parcel: Class not found when unmarshalling: android.support.v4.app.FragmentManagerState java.lang.ClassNotFoundException: android.support.v4.app.FragmentManagerState at j... 阅读详情

本文主要分析android.os.BadParcelableException: ClassNotFoundException when unmarshalling这个异常的原因及解决方法,解释了android的class loader.

 

一、现象:
应用打开,home键到后台,过一段时间打开,偶现fc,log如下:

程序中的写法是

报错的语句即为config = in.readParcelable(null);

 

二、原因分析:
根据android文档介绍:
readParcelable (ClassLoader loader)
loader A ClassLoader from which to instantiate the Parcelable object, or null for the default class loader.
即loader为空时系统会采取默认的class loader。

 

Android有两种不同的classloaders:framework classloader和apk classloader,其中framework classloader知道怎么加载android classes,apk classloader知道怎么加载you code,apk classloader继承自framework classloader,所以也知道怎么加载android classes。

 

在应用刚启动时,默认class loader是apk classloader,但在系统内存不足应用被系统回收会再次启动,这个默认class loader会变为framework classloader了,所以对于自己的类会报ClassNotFoundException。

 

三、解决方法:
将config = in.readParcelable(null);改为config = in.readParcelable(Config.class.getClassLoader());
Config.class.getClassLoader()即为apk classloader, 其中Config.class可以改为你程序中自己写的任意类,因为他们同样指向apk loader
嘿嘿,试着改为config = in.readParcelable(Activity.class.getClassLoader());你会发现依然ClassNotFoundException因为Activity.class.getClassLoader()指向的是framework classloader

 

四、如何测试重现这个问题,方便测试呢:
重现这个问题即使的应用被系统回收,把设置->开发者选项->不保留活动开关打开,打开测试程序按home键,再打开测试程序就会执行到这句。

如果你是在onSaveInstanceState中保存
savedInstanceState.putParcelable(key, value),则需要设置Bundle的class loader,如下:
savedInstanceState.setClassLoader(getClass().getClassLoader());

 

PS:
(1)、readParcelableArray(ClassLoader loader), readParcelable, readArray,readArrayList, readBundle, readHashMap, readParcelable, readSparseArray, readValue, readList, readMap也有可能报上面的异常

 

相关博客:

关于Parcelable以及Parcelable和Serializable的区别的区别,可参考以前写的:http://www.cnblogs.com/trinea/archive/2012/11/09/2763213.html
参考:http://stackoverflow.com/questions/13997550/unmarshalling-errors-in-android-app-with-custom-parcelable-classes
http://developer.android.com/reference/android/os/Parcel.html#readParcelable(java.lang.ClassLoader

BadParcelableException:Parcelable protocol requires a Parcelable 错误 在Android中的不同Activity之间传递对象,采用Bundle.putParcelable(Key, Object)时,在实现Parcelable接口的时候要注意一下方面; /** * 必须实现Parcelable.Creator接口,否则在获取该类数据的时候会报错 *  * android.os.BadParcelableException:Parcelable protocol 阅读详情

相关推荐

2022北京高考数学压轴题21题:Python暴力枚举验证k≥7的5种反例

本文探讨了2022北京高考数学压轴题21题的编程解法,通过Python暴力枚举验证k≥7的5种反例。文章详细介绍了m-连续可表数列的定义、问题转化与约束条件,并提供了暴力枚举算法设计和优化技巧,帮助读者理解如何用编程思维解决数学问题。

weixin_33552698的博客 233

探索ClassLoader,解决 android.os.BadParcelableException: ClassNotFoundException when unmarshalling

本文基于本人在项目开发中遇到的实际问题,对ClassNotFoundException异常发生的原因和解决办法做了探究。 定位异常 首先看看出问题的代码。 Application 1 的部分代码: ... private MediaSessionCompat mMediaSession = new MediaSessionCompat(this, TAG); ... private voi...

勤奋的果子的博客 4306

AI 大模型在电商精准营销中的应用

例如,对于用户 A 和用户 B,通过比较他们对共同评价过的商品的评分差异来确定相似度。其中,(Gain(D,a))表示特征(a)对数据集(D)的信息增益,(Ent(D))表示数据集(D)的信息熵,(V)表示特征(a)的取值个数,(D^{v})表示特征(a)取值为(v)的样本子集。其中,(sim(A,B))表示用户 A 和用户 B 的相似度,(I)表示用户 A 和用户 B 共同评价过的商品集合,(R_{A,i})和(R_{B,i})分别表示用户 A 和用户 B 对商品(i)的评分。(三)营销活动效果预测。

alittlehippo的博客 1627

遇到android.os.BadParcelableException: ClassNotFoundException when unmarshalling怎么解决

本文基于本人在项目开发中遇到的实际问题,对ClassNotFoundException异常发生的原因和解决办法做了探究。 定位异常 首先看看出问题的代码。 Application 1 的部分代码: private MediaSessionCompat mMediaSession = new MediaSessionCompat(this, TAG); private void s...

Dream It Possible 1万+

产品经理必看!用Cursor自动生成符合开发规范的技术文档(含UI设计规则模板)

本文详细介绍了产品经理如何利用Cursor工具自动生成符合开发规范的技术文档,并整合UI设计规则模板。通过配置标准化文档结构和设计关联规则,Cursor能有效解决术语不统一、结构混乱等问题,提升跨团队协作效率。文章包含实际案例、规则配置要点及企业级实施方案,帮助产品经理快速掌握AI辅助文档生成技巧。

emacs5lisp的博客 224

深入NAND Flash信号与接口:结合ONFI 5.0协议,聊聊DBI、ODT和差分信号到底在解决什么实际问题

本文深入探讨了NAND Flash信号与接口设计,结合ONFI 5.0协议,详细解析了DBI、ODT和差分信号等技术如何解决高速数据传输中的信号完整性问题。通过实际案例和数据,展示了这些技术在降低功耗、减少噪声和提升抗干扰能力方面的显著效果,为存储工程师提供了宝贵的实践参考。

weixin_33736649的博客 343

android.os.BadParcelableException: ClassNotFoundException when unmarshalling报错

低端机上intent使用bundle传递parcelable对象,一直crash,报错android.os.BadParcelableException: ClassNotFoundException when unmarshalling 只要将下面的写法 Bundle bundle = new Bundle(); bundle.putParcelable(BUNDLE_L...

u014050788的专栏 1312

阿里开源最强数字人工具 EchoMimicV2,本地部署(一)

EchoMimicV2是阿里推出的半身人体AI数字人项目,基于参考图片、音频剪辑和手部姿势序列生成高质量动画视频,确保音频内容与半身动作的一致性。现在本地部署,安装体验一下。

缘分天空的专栏 4614

Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling:

最近用ContentProvider实现跨进程传递数据的时候报了这个异常,通过参考https://blog.csdn.net/Bettarwang/article/details/45315091这篇博客成功解决了问题 只需要在获取数据之前加上setClassLoader()这个方法就可以了 ...

qq_29087343的博客 1991

继电器的选型规范

触点是继电器中最重要的结构件,触点的使用寿命受触点材料、触点上的电压及电流值(特别是接通时及断开时的电压、电流波形)、负载种类、切换频率、环境情况、接触形式、触点回跳现象等的影响,触点失效多以触点的材料转移、粘连、异常消耗、接触电阻增大等故障现象出现,使用时需要注意。为了稳定工作, DC 型继电器的线圈两端所加电压推荐使用波纹变化率小于±5%的线圈额定电压,否则继电器会工作不稳定,引起触点的粘接或异常损耗,特别是在继电器的驱动电路上连接有电动机、螺线管、变压器等器件时,这种情况更为明显。

qq_43416206的博客 1881

3、利用预训练卷积神经网络进行特征提取

本文介绍了如何使用预训练的卷积神经网络(如VGG16)进行图像特征提取,并将提取的特征存储在HDF5数据集中,以便后续用于机器学习模型的训练。文章详细阐述了特征提取的原理、HDF5数据格式的优势、HDF5DatasetWriter类的实现、特征提取流程的代码实现以及实际应用案例。通过该方法,可以在多种图像数据集上高效构建高精度的分类模型。

z2a3b4c5d的博客 114

android.os.BadParcelableException: ClassNotFoundException when unmarshalling:解决办法

例如在用AlarmManager的时候 1 AlarmManager alarmMgr = (AlarmManager) mContext 2 .getSystemService(Context.ALARM_SERVICE); 3 Intent intent = new Intent(ALARM_ALERT); 4 ...

weixin_30604651的博客 605

EMC辐射整改常用的4种整改方法

例如,产品设计研发工程师们根据需求,设计出效果良好的滤波电路,置入产品I/O(输入/输出)接口的前级,可使因传导而进入系统的干扰噪声消除在电路系统的入口处;通过选择元器件和合理安排的电路系统,使干扰的影响减少。有些频率点是通过电路板上走线分布参数所决定的,通过前述方法不大有用,此类整改通过在走线中增加小的电感、电容、磁珠来改变电路参数结构,使其移到限值要求较高的频率点上。电线电缆的分类整理在电子设备中,线间耦合是一种重要的途径,也是造成干扰的重要原因,因为频率的因素,可大体分为高频耦合与低频耦合。

学海无涯的专栏 3124

android问题集锦之十二:android.os.BadParcelableException: ClassNotFoundException when unmarshalling

在上篇文Activity间传类对象数据中的person类中加入一个List字段的话,如下 package com.linc.meta; import android.os.Parcel; import android.os.Parcelable; public class Person implements Parcelable { private Str

懒人的技术笔记 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ClassNotFoundException when unmarshalling Crash

我们看过Bundle代码之后,就会发现无论读写Bundle对象的内容,都会先调用unparcel这个方法,它的作用就是反序列化的核心,将二进制格式的数据转换成内存中的Java对象,所以这个过程中必然是要进行类加载创建对象的,也就是在这个过程中出现ClassNotFoundException。我们在上文其实讲过Bundle的unparcel作用了,反序列化过程会按照存储对象的类型分别进行,这个过程在Parcel.readValue方法中, 其中解析Bundle类型对象会调用到readBundle方法。

meishuang2306的博客 1622

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

安卓Parcelable反序列化报错,Parcelable ClassNotFoundException when unmarshalling

Bundle中默认的ClassLoader 是继承BaseBundle 中的 BootClassLoader 这个加载器。看到结果是PathClassLoader,这个ClassLoader是加载APK应用的,所以能找到我们写的类,这很显然~如果自己debug进去看 Parcel.java中2789行,readParcelableCreator()方法。从我这里的现象却不是这样的,因为没涉及系统内存不足的情况,所以我觉得应该不是这个原因。这个加载器只加载 系统里面或者SDK的类,当然不会有我们自己写类。

w123456wwqq的博客 1439

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android.os.BadParcelableException: ClassNotFondException when unmarshalling

出现这个异常的原因是因为在调用Parcel类的诸如readList(List outVal, ClassLoader loader)的API时传入了错误的loader,这里容器里面放入的是什么类就需要使用什么loader,例如List,就需要传入MyClass.class.getClassLoader() 另外在自己的类实现Parcelable接口的时候,如果其中使用到了非基础类型MyClass

1566
上一篇: Java并发编程:volatile关键字解析
下一篇: Java 8系列之Stream的基本语法详解
candyguy242
博客等级 码龄17年 63粉丝 37原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值