2

我有一个名为 AllStatStruct 的类。这个类包含三个属性,它们是我的类 StatStructCycle、StatStructHistory 和 MatrixStruct 的对象。每个类都扩展类 DataStruct 并实现 Parcelable 接口。readParceable()在接口的实现中,每个类都是使用or来读写的writeParceable()

在我的 Activity 中,我在 AsyncTask 中调用 SOAP webservice 并获取 class 的对象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 中的跟踪输出中看到的那样。但是在解组包裹时,会发生 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当我尝试用StatStructCycles 解组我的 ArrayList 时,我得到了一个 , 。我注释掉了历史的其他部分。

我尝试使用 and 编写和读取 ArrayList writeTypedList(List<T> list)readTypedList(List<T> list, Creator<T> c)但它也不起作用。

当我使用 ArrayLists 时,我还使用 将它们的容量调整为实际大小trimToSize(),因为我认为 ArrayList 的“空”插槽可能会导致问题。但同样,情况并非如此......

使用调试器启动应用程序显示,编组StatStructHistory没有空值......每个属性或列表项都被初始化。我不知道这NullPointerException是从哪里来的。

最好的问候 htz

4

1 回答 1

0

解组parcelables的问题

看起来即使您的编组成功,如果有空异常,解组过程仍然会失败。

出于调试目的,请尝试逐个编组每个子对象。看看其中是否有任何错误,然后深入研究问题。现在,您正试图一次解组 3 个对象,并且很难确定哪个对象有问题(如果有的话)。

如果不清楚,我建议尝试这个:

bundle.putParcelable("allStatStruct", ass.StatStructCycle); 

如果可行,请尝试:

bundle.putParcelable("allStatStruct", ass.StatStructHistory); 

ETC...

于 2012-05-11T13:48:42.593 回答