进程间传递Parcelable对象出现ClassNotFoundException异常的解决方法:

在开发中可能有时候会遇到用Bundle传递一个Parcelable对象时出现ClassNotFoundException异常,而且这个异常有时候会出现有时候又不会出现,比如你在同一个进程的Activity间传递数据时就不会出现,但是你通过Messenger携带bundle进行进程通信时就会出现,具体是什么原因?

我先总体说下出现这个问题的原因和解决方案,然后再从源码分析为什么这样做.
首先出现这个异常的原因是因为ClassLoader不对造成的,我们应用中存在两种类加载器它们分别是BootClassLoader和PathClassLoader.
BootClassLoader用来加载系统类,PathClassLoader用来加载我们在应用中自己写的类.所以当类加载器为BootClassLoader时我们要加载自己写的类就会出现ClassNotFound异常.

在进程间通信中Messenger携带bundle传递Parcelable对象,在到达另一个进程后通过bundel取出parcelable对象时出现ClassNotFound异常是因为它通过BootClassLoader来加载我们的Parcelable对象

解决方案:
在bundle读取数据前加这行代码:
bundle.setClassLoader(getClass().getClassLoader());
这里有两点需要注意:
1.getClass().getClassLoader()不一定得到的是PathClassLoader,有些类的ClassLoader默认是BootClassLoader,这个后面会讲.所以在用这行代码之前还是要先确定是否拿到的是PathClassLoader.
2.如果bundle同时传了parcelable对象和其他基本类型的数据,比如int或者String.那么必须在getxxx之前就调用bundle.setClassLoader(getClass().getClassLoader());,否则同样会出错,原因见后面分析.

现在我们来具体分析:
我们通过源码看看Bundle是怎么获取数据的:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值