【发布时间】:2012-12-09 11:18:33
【问题描述】:
对于我的 Android 应用程序,我遇到了几个解组错误,尽管我认为我已经完成了通过 Parcelables 正确保存和加载对象所需的一切。你能告诉我我的代码有什么问题吗?
错误 1:
java.lang.RuntimeException: Unable to start activity ComponentInfo
Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@41279860: Unmarshalling unknown type code 6619241 at offset 1372
at android.os.Parcel.readValue(Parcel.java:1922)
at android.os.Parcel.readMapInternal(Parcel.java:2094)
at android.os.Bundle.unparcel(Bundle.java:223)
at android.os.Bundle.getParcelable(Bundle.java:1158)
at android.app.Activity.onCreate(Activity.java:860)
at my.app.package.PlayComputer.onCreate(PlayComputer.java:1012)
at android.app.Activity.performCreate(Activity.java:4465)
MyActivity 中的第 1012 行是对Activity 的onCreate() 中的super.onCreate(savedInstanceState); 的调用。
protected void onSaveInstanceState(Bundle savedInstanceState) {
if (myObject == null) {
savedInstanceState.putParcelable("myObject", null);
}
else {
savedInstanceState.putParcelable("myObject", myObject);
}
savedInstanceState.putInt(...);
savedInstanceState.putString(...);
savedInstanceState.putBoolean(...);
super.onSaveInstanceState(savedInstanceState);
}
myObject 属于 MyObject 类,具有以下方法:
public void writeToParcel(Parcel out, int flags) {
out.writeIntArray(...);
out.writeInt(...);
out.writeStringArray(...);
out.writeString(...);
out.writeParcelableArray(..., flags);
}
public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() {
public MyObject createFromParcel(Parcel in) {
try {
if (in == null) {
return null;
}
else {
return new MyObject(in);
}
}
catch (Exception e) {
return null;
}
}
public MyObject[] newArray(int size) {
return new MyObject[size];
}
};
private MyObject(Parcel in) {
in.readIntArray(...);
... = in.readInt();
in.readStringArray(...);
... = in.readString();
... = (OtherObject[]) in.readParcelableArray(OtherObject.class.getClassLoader());
}
错误 2:
java.lang.RuntimeException: Unable to start activity ComponentInfo
Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling:
at android.os.Parcel.readParcelable(Parcel.java:1971)
at android.os.Parcel.readValue(Parcel.java:1859)
at android.os.Parcel.readMapInternal(Parcel.java:2099)
at android.os.Bundle.unparcel(Bundle.java:223)
at android.os.Bundle.getParcelable(Bundle.java:1158)
at android.app.Activity.onCreate(Activity.java:905)
at my.app.package.PlayComputer.onCreate(SourceFile:1012)
相同的文件和类。
错误 3:
java.lang.RuntimeException: Unable to start activity ComponentInfo
Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@4051aff8: Unmarshalling unknown type code 7340149 at offset 1276
at android.os.Parcel.readValue(Parcel.java:1913)
at android.os.Parcel.readMapInternal(Parcel.java:2083)
at android.os.Bundle.unparcel(Bundle.java:208)
at android.os.Bundle.getParcelable(Bundle.java:1100)
at my.app.package.PlayComputer.onCreate(SourceFile:1111)
这一次,导致的行(1111)是以下一行:
myObject = (MyObject) savedInstanceState.getParcelable("myObject");
【问题讨论】:
-
GameState(Parcel in) 构造函数是不是拼写错误,而您要编写 MyObject(Parcel in) 构造函数?
-
您是否在构造函数中单独创建数组对象?
readXXXArray()方法需要传入一个完全初始化的数组实例。您可以使用createXXXArray()方法将该数组的新实例返回给您。 -
当然,这些数组之前已经声明过,但还没有必要初始化。从文档中,我看不出这是一个先决条件:developer.android.com/reference/android/os/Parcel.html
-
嗯,
Parcel和Parcelable的文档很差,所以我看不出readXXXArray()和writeXXXArray的区别。 -
那么
writeTypedArray(MyObject.CREATOR)也是保存Parcelables的推荐方法吗?正如你在上面看到的,我使用了writeParcelableArray()。
标签: android exception parcelable runtimeexception