android.os.BadParcelableException: ClassNotFoundException when unmarshalling

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

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


1

2

3


E/AndroidRuntime(9085): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: *.*.*.*.Layout$Config

E/AndroidRuntime(9085): at android.os.Parcel.readParcelable(Parcel.java:2077)

E/AndroidRuntime(9085): at *.*.*.<init>(Layout.java:105)

程序中的写法是

Java


1

2

3

4

5

6

7


public Config config;

public RowView(Parcel in){

type = in.readString();

interfaceUrl = in.readString();

size = in.readInt();

config = in.readParcelable(null);

}

报错的语句即为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也有可能报上面的异常

时间: 2024-09-09 00:07:42

android.os.BadParcelableException: ClassNotFoundException when unmarshalling的相关文章

《Android应用开发攻略》——1.15 程序:Android OS下的小费计算器Tipster

1.15 程序:Android OS下的小费计算器Tipster Sunit Katkar1.15.1 问题 当你和朋友前往饭店就餐并且希望计算各自的账单和小费时,可能陷入许多手动计算和分歧之中.你希望使用一个应用程序,简单地将小费比例加到总额上,并且按照就餐人数分配.Tipster就是Android中的一个实现,用它展示一个完整的应用程序.1.15.2 解决方案 这是一个简单的练习,使用Android中的基本GUI元素,然后用一些简单的计算和事件驱动UI代码将它们组合起来.将用到如下GUI组件

Android3.0版本以上出现android.os.NetworkOnMainThreadException异常与处理方式

http://www.cnblogs.com/awenhome/archive/2012/01/04/2311659.html 以前用2.2 访问WebService没有问题,到3.0上访问出现android.os.NetworkOnMainThreadException 找了资料经过实践,解决方法如下: StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWr

networking-出现android.os.NetworkOnMainThreadException异常

问题描述 出现android.os.NetworkOnMainThreadException异常 当我运行我的android工程时,下边的代码中我得到了一个错误 URL url= new URL(urlToRssFeed); SAXParserFactory factory =SAXParserFactory.newInstance(); SAXParser parser=factory.newSAXParser(); XMLReader xmlreader=parser.getXMLReade

android.os.NetworkOnMainThreadException

问题描述 android.os.NetworkOnMainThreadException package com.demo.clientdemo; import java.io.IOException;import java.io.InputStream; import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.H

关于java问题-android中android.os.Process.killProcess(android.os.Process.myPid( ) );

问题描述 android中android.os.Process.killProcess(android.os.Process.myPid( ) ); 其中android os Process killProcess myPid 他们是路径间的关系么 ,还是子类和父类的关系,还是对象和方法的关系,我有点分不清,求指点,谢谢 解决方案 android包下面有一个os包,os包下面有一个Process包. killProcess().myPid()都是Process类的静态方法, 解决方案二: and

Facebook版的Android OS,将被称作"Facebook Home"

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   此前,我们报道过Facebook正计划推出定制版的Google Android操作系统,且其"特别版"Android OS将于HTC的设备上首次亮相.据推测,该OS将搭载HTC的设备推出:不过也有报道称,它也能在HTC的旧设备.甚至是旗舰级的HTC One上运行.现在的报道是,Facebook版的Android OS,将被称作"Fa

【ANDROID游戏开发二十一】ANDROID OS设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/356.html 刚才一群里的兄弟问的一问题,稍微研究下,这里一起分享:新建的Emulator -配置为:WAGA800  其分辨率是 800*480 的设备模拟器,当我们程序中在取得其 Height和 Width的时候发现,总是 320*533 ,明显是系统对我们撒了谎!如下图:   下面是官方文档原文: http

android.os.BinderProxy cannot be cast to com解决办法

Android在绑定服务的时候出现java.lang.ClassCastException:android.os.BinderProxy cannot be cast to com. 修改manifest文件里边相关服务去掉android:process=":remote"即可.

Caused by: android.os.NetworkOnMainThreadException错误解决办法

好久不写Android代码手都生了,找出自己之前写的程序发现跑不了了,也没啥特别的错误提示,就看到一句有用的错误Caused by: android.os.NetworkOnMainThreadException,查了下原因上在4.0之后在主线程里面执行Http请求都会报这个错,大概是怕Http请求时间太长造成程序假死的情况吧. 解决办法有两个思路,分别是: 第一种方法:直接忽视,强制使用(强烈不推荐,但是修改简单) 在MainActivity文件的setContentView(R.layout