我们在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
答案 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类和相应子类中的read
和write
的顺序。
您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并触发该错误