如何解决Parcel android.os.Parcel@72a6e36:在偏移量 500 处解组未知类型代码 2131365270
我遇到了与其他 20 个主题几乎相同的问题,这些主题指向 RuntimeException: Parcel android.os.Parcel@72a6e36: Unmarshalling unkNown type code
,但偏移量不同 (500):
Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@72a6e36: Unmarshalling unkNown type code 2131365270 at offset 500
at android.os.Parcel.readValue(Parcel.java:2443)
at android.os.Parcel.readSparseArrayInternal(Parcel.java:2798)
at android.os.Parcel.readSparseArray(Parcel.java:2067)
at android.os.Parcel.readValue(Parcel.java:2421)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2717)
at android.os.BaseBundle.unparcel(BaseBundle.java:269)
at android.os.Bundle.getSparseParcelableArray(Bundle.java:910)
at com.android.internal.policy.PhoneWindow.restoreHierarchyState(PhoneWindow.java:2129)
at android.app.Activity.onRestoreInstanceState(Activity.java:1047)
at android.app.Activity.performRestoreInstanceState(Activity.java:1002)
at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1174)
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2619)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
在将 2 个类从 Java 转换为 Kotlin 后,我的问题开始出现,这些类继承自 ViewGroup
和 View
,并且仅在应用的混淆版本中。
我的 proguard 配置有一个规则:
-keepclassmembers class * implements android.os.Parcelable {
static ** CREATOR;
}
所以事实并非如此。这个问题很难发现。
解决方法
事实证明,它连接到 Parcelable
CREATOR
代码。将类转换为 Kotlin 后,转换器是这样做的:
companion object {
val CREATOR: Parcelable.Creator<SavedState> = object : Parcelable.Creator<SavedState> {
override fun createFromParcel(inParcel: Parcel): SavedState? {
return SavedState(inParcel)
}
override fun newArray(size: Int): Array<SavedState?> {
return arrayOfNulls(size)
}
}
}
长话短说,我在项目上运行 lint
(来自 gradle tasks
),它给了我正确的答案,代码中有一行:
Error: Field should be annotated with @JvmField [ParcelCreator]
val CREATOR: Parcelable.Creator<SavedState> = object : Parcelable.Creator<SavedState> {
总而言之,CREATOR
字段应使用 @JvmField
进行注释,如下所示:
companion object {
@JvmField
val CREATOR: Parcelable.Creator<SavedState> = object : Parcelable.Creator<SavedState> {
override fun createFromParcel(inParcel: Parcel): SavedState? {
return SavedState(inParcel)
}
override fun newArray(size: Int): Array<SavedState?> {
return arrayOfNulls(size)
}
}
}
这解决了我的问题。关于 lint
的堆栈溢出线程没有提及,所以如果您遇到困难并且没有尝试过 lint,也许这会有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。