【问题标题】:Parcel android.os.Parcel@72a6e36: Unmarshalling unknown type code 2131365270 at offset 500Parcel android.os.Parcel@72a6e36:在偏移量 500 处解组未知类型代码 2131365270
【发布时间】:2021-02-07 21:22:23
【问题描述】:

我遇到的问题与其他 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;
}

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

【问题讨论】:

    标签: java android kotlin android-view parcelable


    【解决方案1】:

    事实证明,它已连接到 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,也许这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-06
      • 2011-05-10
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多