美文网首页
android使用Messenger进程间通讯出现的ClassN

android使用Messenger进程间通讯出现的ClassN

作者: sSongSong | 来源:发表于2018-12-23 23:27 被阅读0次

    进程间通讯一般分为三种

    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进程间通讯出现的ClassN

          本文链接:https://www.haomeiwen.com/subject/amduzftx.html