android使用Messenger进程间通讯出现的ClassN
进程间通讯一般分为三种
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加载。