包裹解组未知类型代码

时间:2013-10-30 02:29:51

标签: android exception unmarshalling parcelable parcel

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

所有Parcelable对象都定义了 CREATOR,writeToParcel()和contructor 。所有列表和复杂类型都被初始化并进行空值检查。

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

7 个答案:

答案 0 :(得分:22)

我遇到了自定义视图的问题,该视图有自己的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;
    }
...
}

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

希望它有所帮助。

答案 1 :(得分:8)

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

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

答案 2 :(得分:2)

检查您的Parcelable类和相应子类中的readwrite的顺序。

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

答案 3 :(得分:0)

当我读取Parcel源时出现此错误,要保存在Map上而不是检查返回值是否为null:

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

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

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);
}

答案 4 :(得分:0)

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

在读取/写入您的Parcelable类和相应的子类时,检查 顺序并计算

答案 5 :(得分: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 { *; }

答案 6 :(得分:-1)

在我的情况下,我试图将一个arrayList分配给List并触发该错误