一、问题描述及解决方式
问题描述:这个问题主要出在某些版本的手机上面使用了Intent直接传递Parcelable数据,且Parcelable类型是使用默认方式生成的。示例如下:
@Parcelize
data class FunctionResultBean(
val isComplete: Boolean = false, //是否完成
val completeDesc: String = "none", //完成结果的描述
): Parcelable
传递方式如下:
fun launch(
cxt: Context,
desArray: ArrayList<FunctionResultBean> = arrayListOf()
) {
val intent = Intent(cxt, PcmResultActivity::class.java)
intent.putParcelableArrayListExtra(KEY_FUNCTION_SUB_DES_ARRAY, desArray)
cxt.startActivity(intent)
}
修改方式有多种,这里使用比较方便的一种,
fun launch(
cxt: Context,
desArray: ArrayList<FunctionResultBean> = arrayListOf()
) {
val intent = Intent(cxt, PcmResultActivity::class.java)
val bundle = Bundle()
bundle.putParcelableArrayList(KEY_FUNCTION_SUB_DES_ARRAY, desArray)
intent.putExtra("KEY",bundle)
cxt.startActivity(intent)
}
还有一种方式是自己生成Parcelable类,不再使用默认的,自己生成时候替换默认加载器BootClassLoader为自己的类加载器,如下:
mHashMap = in.readHashMap(HashMap.class.getClassLoader())
# 修改如下
mHashMap = in.readHashMap(TestBean.class.getClassLoader());
另外一种方式是在使用Intent传递数据时候添加加载器
intent.setExtrasClassLoader(ImagesSet::class.java.classLoader)
除此之外还可以转换成字节数组传递,该方式出现在Alarms.java中
二、日志
Class not found when unmarshalling
com.speedclean.master.expert.function.finish.FunctionResultBean
java.lang.ClassNotFoundException:
com.speedclean.master.expert.function.finish.FunctionResultBean
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:453)
at android.os.Parcel.readParcelableCreator(Parcel.java:2827)
at android.os.Parcel.readParcelable(Parcel.java:2781)
at android.os.Parcel.readValue(Parcel.java:2684)
at android.os.Parcel.readListInternal(Parcel.java:3114)
at android.os.Parcel.readArrayList(Parcel.java:2335)
at android.os.Parcel.readValue(Parcel.java:2705)
at android.os.Parcel.readArrayMapInternal(Parcel.java:3053)
at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:288)
at android.os.BaseBundle.unparcel(BaseBundle.java:232)
at android.os.BaseBundle.getString(BaseBundle.java:1155)
at android.content.Intent.getStringExtra(Intent.java:8135)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:739)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:677)
at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1646)
at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:619)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6745)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6626)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:6617)
at android.app.IActivityManager$Stub.onTransact$startActivity$(IActivityManager.java:10870)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:111)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:4181)
at android.os.Binder.execTransact(Binder.java:739)
Caused by: java.lang.ClassNotFoundException: com.speedclean.master.expert.function.finish.FunctionResultBean
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:1346)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:1406)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:453)
at android.os.Parcel.readParcelableCreator(Parcel.java:2827)
at android.os.Parcel.readParcelable(Parcel.java:2781)
at android.os.Parcel.readValue(Parcel.java:2684)
at android.os.Parcel.readListInternal(Parcel.java:3114)
at android.os.Parcel.readArrayList(Parcel.java:2335)
at android.os.Parcel.readValue(Parcel.java:2705)
at android.os.Parcel.readArrayMapInternal(Parcel.java:3053)
at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:288)
at android.os.BaseBundle.unparcel(BaseBundle.java:232)
at android.os.BaseBundle.getString(BaseBundle.java:1155)
at android.content.Intent.getStringExtra(Intent.java:8135)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:739)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:677)
at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1646)
at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:619)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6745)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6626)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:6617)
at android.app.IActivityManager$Stub.onTransact$startActivity$(IActivityManager.java:10870)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:111)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:4181)
at android.os.Binder.execTransact(Binder.java:739)
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available