20

我们在 Play 商店记录的崩溃报告中收到此错误。无法在我们所有的测试中复制这一点。有没有其他人有同样的问题或解决方案?问题是,我们甚至不知道如何复制这个错误。

所有 Parcelable 对象都定义了CREATOR、writeToParcel() 和构造函数。所有列表和复杂类型都已初始化并检查是否为空。

java.lang.RuntimeException: Unable to start activity ComponentInfo{au.com.company/au.com.company.DetailsActivity}: java.lang.RuntimeException: Parcel android.os.Parcel@42d6e270: Unmarshalling unknown type code 6881381 at offset 11268
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2247)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2297)
at android.app.ActivityThread.access$700(ActivityThread.java:152)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5328)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@42d6e270: Unmarshalling unknown type code 6881381 at offset 11268
at android.os.Parcel.readValue(Parcel.java:2032)
at android.os.Parcel.readMapInternal(Parcel.java:2225)
at android.os.Bundle.unparcel(Bundle.java:223)
at android.os.Bundle.getSparseParcelableArray(Bundle.java:1240)
at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:861)
at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1104)
at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1086)
at android.support.v4.app.FragmentManagerImpl.dispatchCreate(SourceFile:1872)
at android.support.v4.app.FragmentActivity.onCreate(SourceFile:215)
at android.support.v7.app.ActionBarActivity.onCreate(SourceFile:97)
at au.com.company.DetailsActivity.onCreate(SourceFile:40)
at android.app.Activity.performCreate(Activity.java:5250)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
... 11 more
4

7 回答 7

23

我遇到了一个自定义视图有自己的 View.BaseSavedState 实现的问题。事实证明,那里的 writeToParcel() 方法的方法调用顺序错误。

发现问题很烦人,我需要逐步调试 Android SDK 到 Bundle 类,在该类中调用 unparcel():

synchronized void unparcel() {
    if (mParcelledData == null) {
        return;
    }

    int N = mParcelledData.readInt();
    if (N < 0) {
        return;
    }
    if (mMap == null) {
        mMap = new HashMap<String, Object>(N);
    }
    mParcelledData.readMapInternal(mMap, N, mClassLoader);
    mParcelledData.recycle();
    mParcelledData = null;
}

日志的第 223 行正是 readMapInternal() 调用。Parcel 对象将在此处遍历其项目,并一一读取值。如果某些内容以错误的顺序写入,通常会出现问题。Parcel.readValue(ClassLoader loader) 方法将按照它们的写入顺序读取它们,但是如果您有自定义视图或对象,如果它们的写入顺序与您现在正在读取它们的顺序不同,则会在下一个要阅读的项目。

所以我通过识别最后一个成功读取的项目发现了问题。您通常可以通过检查其创建者类名称来识别它(如果它是自定义视图或对象)。检查 Parcel 类的方法 readParcelableCreator():

public final <T extends Parcelable> Parcelable.Creator<T> readParcelableCreator(
        ClassLoader loader) {
    String name = readString();
    if (name == null) {
        return null;
    }
...
}

您可以检查创建者类的名称字符串。如果是定制的,您可以立即识别它。然后,如果下一次阅读使您的应用程序崩溃,您几乎可以确定罪魁祸首是上一次阅读。

希望能帮助到你。

于 2013-11-14T10:06:34.017 回答
8

我也遇到了这个错误,但我发现了问题。我已将变量从 long 更改为 int 但忘记更改以下内容:

我有parcel.writeLong(number),然后读回来number=parcel.readInt()。正确的是parcel.writeInt(number)

于 2014-05-30T13:29:13.970 回答
3

检查您的readwrite在您的 Parcelable 类和各自的子类中的顺序。

您的顺序writeToParcel应该与您在MyParcelable(Parcel in)方法中阅读的顺序相同。

于 2017-02-14T04:35:20.083 回答
0

当我在阅读 Parcel 源时收到此错误,以保存在地图上而不是检查返回值是否为空,如下所示:

String tag = in.readString();
Double value = in.readDouble();
while (tag != null && value != null) {
    this.observations.put(tag, value);
    tag = in.readString();
    value = in.readDouble();
};

应该存储一个 int 用于在 Parcel 上正确迭代:

int numObservations = in.readInt();
String key;
Double value;
for (int i = 0; i < numObservations; i++) {
    key = in.readString();
    value = in.readDouble();
    map.put(tag, value);
}
于 2014-07-17T18:03:14.900 回答
0

我在读取包裹时发生了同样的错误。

在读/写 Parcelable 类和相应的子类时检查顺序和计数。

于 2017-08-08T05:42:49.867 回答
0

如果您有自己的 SavedState 类,请确保它不是 Proguarded 并且也不是CREATOR静态属性。

使用类似的东西:

# Keeping *SavedState and *SavedState#CREATOR
-keep public final class * extends android.view.AbsSavedState
-keepclassmembers public final class * extends android.view.AbsSavedState { *; }
于 2017-09-18T09:49:40.090 回答
-1

就我而言,我试图将 arrayList 分配给 List 并触发该错误

于 2018-05-03T20:01:49.497 回答