包裹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,继承自ViewGroupView,只有在一个混淆的版本的应用程序。
我的proguard配置有一个规则:

-keepclassmembers class * implements android.os.Parcelable {
static ** CREATOR;
}

所以事实并非如此。这个问题很难发现。

原来,它连接到ParcelableCREATOR代码。在将类转换为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,也许这可以帮助。

相关内容

  • 没有找到相关文章

最新更新