java - android.os.BadParcelableException ClassNotFoundException 时解组:内部类
问题描述
我有一个父类OuterClass
,它包含一个List
类型的对象InnerClass
,它是一个静态内部类OuterClass
。静态内部类实现Parcelable
.
我遇到了这个错误:
Caused by android.os.BadParcelableException
ClassNotFoundException when unmarshalling: com.example.OuterClass.InnerClass
android.os.Parcel.readParcelableCreator + 2535 (Parcel.java:2535)
android.os.Parcel.readParcelable + 2461 (Parcel.java:2461)
android.os.Parcel.readValue + 2364 (Parcel.java:2364)
android.os.Parcel.readListInternal + 2778 (Parcel.java:2778)
android.os.Parcel.readArrayList + 2035 (Parcel.java:2035)
android.os.Parcel.readValue + 2385 (Parcel.java:2385)
android.os.Parcel.readArrayMapInternal + 2717 (Parcel.java:2717)
android.os.BaseBundle.unparcel + 269 (BaseBundle.java:269)
android.os.BaseBundle.getLongArray + 1271 (BaseBundle.java:1271)
android.content.Intent.getLongArrayExtra + 6441 (Intent.java:6441)
com.example.MyFragment.onCreate + 169 (MyFragment.java:169)
androidx.fragment.app.Fragment.performCreate + 2414 (Fragment.java:2414)
androidx.fragment.app.FragmentManagerImpl.moveToState + 1418 (FragmentManagerImpl.java:1418)
androidx .fragment.app.FragmentManagerImpl.moveFragmentToExpectedState + 1784 (FragmentManagerImpl.java:1784)
androidx.fragment.app.FragmentManagerImpl.moveToState + 1852 (FragmentManagerImpl.java:1852)
androidx. fragment.app.FragmentManagerImpl.dispatchStateChange + 3269 (FragmentManagerImpl.java:3269)
androidx.fragment.app.FragmentManagerImpl.dispatchCreate + 3223 (FragmentManagerImpl.java:3223)
androidx.fragment.app.FragmentController.dispatchCreate + 190 (FragmentController.java:190)
androidx.fragment.app.FragmentActivity.onCreate + 369 (FragmentActivity.java:369)
androidx.appcompat.app.AppCompatActivity.onCreate + 85 (AppCompatActivity.java:85)
com.example.MyBaseActivity.onCreate + 50 (MyBaseActivity.java:50)
android.app.Activity.performCreate + 6757 (Activity.java:6757)
android.app.Instrumentation.callActivityOnCreate + 1119 (Instrumentation.java:1119)
android.app.ActivityThread.performLaunchActivity + 2704 (ActivityThread.java:2704)
android.app.ActivityThread.handleLaunchActivity + 2812 (ActivityThread.java:2812)
android.app.ActivityThread.-wrap12 (ActivityThread.java)
android.app.ActivityThread$H.handleMessage + 1528 (ActivityThread.java:1528)
android.os.Handler.dispatchMessage + 102 (Handler.java:102)
android.os.Looper.loop + 154 (Looper.java:154)
android.app.ActivityThread.main + 6317 (ActivityThread.java:6317)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run + 872 (ZygoteInit.java:872)
com.android.internal.os.ZygoteInit.main + 762 (ZygoteInit.java:762)
并非所有用户都会发生这种崩溃。我的堆栈跟踪实际上与这篇文章中的非常相似:How to find source of crash of type java.lang.RuntimeException: Parcel android.os.Parcel@####: Unmarshalling unknown type code XXXX at offset YYY
奇怪的是,代码的解组部分甚至没有在运行时执行,但我仍然看到这个错误。
public class OuterClass
{
List<InnerClass> innerClassList;
...
public static class InnerClass implements Parcelable
{
final String name;
final String value;
public InnerClass (Parcel in)
{
this.name = in.readString();
this.value = in.readString();
}
@Override
public int describeContents()
{
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags)
{
dest.writeString(name);
dest.writeString(value);
}
public static Creator<InnerClass> CREATOR = new Creator<InnerClass>()
{
@Override
public InnerClass createFromParcel(Parcel source)
{
return new InnerClass(source);
}
@Override
public InnerClass[] newArray(int size)
{
return new InnerClass[size];
}
}
}
内部类在活动/片段之间传递,如下所示:
intent.putParcelableArrayListExtra(INNER_CLASS_LIST, innerClassList);
innerClassList = getArguments().getParcelableArrayList(INNER_CLASS_LIST);
崩溃是在看似无关的代码行上触发的:
myIds = intent.getLongArrayExtra(EXTRA_MY_IDS)
// the intent object also contains a list of InnerClass
这在内部调用BaseBundle.unparcel()
,然后导致 BadParcelableException。
我肯定错过了什么。任何帮助,将不胜感激。
解决方案
推荐阅读
- java - Java 类正在显示加密密码
- javascript - 如何在同时进行查询时不选择两次相同的对象?
- git - 将 git 配置为始终显示绝对路径
- inheritance - C# - 有没有更好的方法在基类定义中使用扩展接口
- powershell - 将进度条添加到现有脚本
- rotation - Lightningchart js - 我如何旋转刻度文本?
- jquery - 如何使用 jQuery.inArray 检查具有动态值的数组
- typescript - 如何区分与泛型的工会?
- python - pip 无法安装 Cufflinks_ 错误:命令出错,退出状态为 1:
- reactjs - 获取错误:调用 axios 获取请求时请求中止