我有一个名为AllStatStruct的类。该类包含三个属性,它们是我的类StatStructCycle,StatStructHistory和MatrixStruct的对象。每个类都扩展了DataStruct类并实现了Parcelable接口。在接口的实现中,使用readParceable()
或writeParceable()
来读取和写入每个类。
在我的Activity中,我在AsyncTask中调用SOAP Web服务并获取类AllStatStruct
的对象。通过创建Bundle
:
protected void onPostExecute(final AllStatStruct ass) {
if (ass != null) {
if (dialog.isShowing()) {
dialog.dismiss();
}
Bundle bundle = new Bundle();
bundle.putParcelable("allStatStruct", ass);
intent = new Intent(packageContext, PrivateView.class);
intent.putExtras(bundle);
startActivity(intent);
} else {
KreativBarometerMainView.this.showDialog(9999);
}
}
编组包裹效果很好,正如我在LogCat中的跟踪输出中看到的那样。但是当解组parcel时,会发生ClassNotFoundException并且我不知道为什么。这是跟踪:
05-11 15:02:59.796: E/AndroidRuntime(8647): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling:
05-11 15:02:59.796: E/AndroidRuntime(8647): at android.os.Parcel.readParcelable(Parcel.java:1958)
05-11 15:02:59.796: E/AndroidRuntime(8647): at de.kreativBarometer.net.structs.AllStatStruct.<init>(AllStatStruct.java:45)
05-11 15:02:59.796: E/AndroidRuntime(8647): at de.kreativBarometer.net.structs.AllStatStruct$1.createFromParcel(AllStatStruct.java:70)
05-11 15:02:59.796: E/AndroidRuntime(8647): at de.kreativBarometer.net.structs.AllStatStruct$1.createFromParcel(AllStatStruct.java:1)
05-11 15:02:59.796: E/AndroidRuntime(8647): at android.os.Parcel.readParcelable(Parcel.java:1981)
05-11 15:02:59.796: E/AndroidRuntime(8647): at android.os.Parcel.readValue(Parcel.java:1846)
05-11 15:02:59.796: E/AndroidRuntime(8647): at android.os.Parcel.readMapInternal(Parcel.java:2083)
05-11 15:02:59.796: E/AndroidRuntime(8647): at android.os.Bundle.unparcel(Bundle.java:208)
05-11 15:02:59.796: E/AndroidRuntime(8647): at android.os.Bundle.getParcelable(Bundle.java:1100)
05-11 15:02:59.796: E/AndroidRuntime(8647): at de.kreativBarometer.ui.PrivateView.onCreate(PrivateView.java:693)
05-11 15:02:59.796: E/AndroidRuntime(8647): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-11 15:02:59.796: E/AndroidRuntime(8647): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1628)
05-11 15:02:59.796: E/AndroidRuntime(8647): ... 11 more
正如您所看到的,没有找到未找到的课程的名称!所以它正在搜索名为“”的类,当然找不到它。
我不知道为什么会这样。有人能帮我吗?我已经尝试过使用ClassLoader了,但是给了意图一个额外的类加载器并使用这个来解组parcelables不起作用。
修改
正如你的建议,我试图单独传递AllStatStruct的几个部分。它适用于StatStructCycle
和MatrixStruct
,但使用StatStructHistory
时,仍会出现错误。
现在,当我尝试在其中使用NullPointerException
解组我的ArrayList时,我得到StatStructCycle
。我评论了历史的其他部分。
我尝试使用writeTypedList(List<T> list)
和readTypedList(List<T> list, Creator<T> c)
编写和读取ArrayList,但它也无效。
当我使用ArrayLists时,我还使用trimToSize()
将其容量调整为实际大小,因为我认为ArrayList的“空”插槽可能会导致问题。但同样,情况并非如此......
使用调试器启动应用程序显示,已编组的StatStructHistory
没有空值...每个属性或列表项都已初始化。我不知道NullPointerException
来自哪里。
答案 0 :(得分:0)
Problem unmarshalling parcelables
即使您的编组成功,看起来如果存在空例外,则解组过程仍可能失败。
出于调试目的,请尝试逐个编组每个子对象。看看是否有任何错误,然后深入研究问题。现在你正在尝试同时解决3个对象,并且很难确定哪一个有问题(如果有的话)。
如果不清楚,我建议尝试这个:
bundle.putParcelable("allStatStruct", ass.StatStructCycle);
如果有效,请尝试:
bundle.putParcelable("allStatStruct", ass.StatStructHistory);
等...