android使用Messenger进程间通讯出现的ClassNoFind异常处理及分析

进程间通讯一般分为三种

1.AIDL,最常用最全能。

2.广播,最实际,最简单。

3.Messenger,高效,简洁,方便控制。


在学习Messenger进程通讯时,使用客户端发送Parcelable给服务端,服务端在接受该Parcelable时报android.os.BadParcelableException: ClassNotFoundException when unmarshalling。

给出的出错原因如下:

Caused by: java.lang.ClassNotFoundException: Didn't find class com.example.xxx.xxx.bean.BleServiceBean on path: DexPathList[[directory .],nativeLibraryDirectories=[/vendor/lib, /data/cust/lib, /system/lib]]

后面才发现原来是Android有两种不同的classloaders:framework classloader和apk classloader,其中framework classloader知道怎么加载android classes,apk classloader继承自framework classloader,所以也知道怎么加载android classes。但在应用刚启动时,默认class loader是apk classloader,在系统内存不足应用被系统回收会再次启动,这个默认class loader会变为framework classloader了,所以对于自己的类会报ClassNotFoundException。

如果是在要传递的JavaBean中有其中一个Field继承自Parcelable,如Person类中有一个(Man implement Parcelable)属性,那么有很简单的处理方法,只要把类似man = in.readParcelable(null);改为man = in.readParcelable(Man.class.getClassLoader()); 

但是我们这里是直接传递一个List,那要怎么办呢?

其实很简单,只需要在读取Bundle中的数据之前加上如下一行代码:

bundle.setClassLoader(getClass().getClassLoader());

这样就会使用apk classloader加载。

你可能感兴趣的:(android使用Messenger进程间通讯出现的ClassNoFind异常处理及分析)