2

AllStatStruct という名前のクラスがあります。このクラスには、私のクラス StatStructCycle、StatStructHistory、および MatrixStruct のオブジェクトである 3 つの属性が含まれています。すべてのクラスはクラス DataStruct を拡張し、Parcelable インターフェースを実装します。readParceable()インターフェイスの実装では、すべてのクラスがorを使用して読み書きされwriteParceable()ます。

私のアクティビティでは、AsyncTask で SOAP Web サービスを呼び出し、 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 をいじってみましたが、インテントに追加のクラスローダーを与え、これを使用してパーセルブルを非整列化することはできません。

編集:

あなたが示唆したように、私は AllStatStruct のいくつかの部分を別々に渡そうとしました。StatStructCycleおよびMatrixStructでは問題なく動作しますが、StatStructHistoryではまだエラーがスローされます。

NullPointerExceptions を含む ArrayList をアンマーシャリングしようとすると、が得られStatStructCycleます。履歴の他の部分をコメントアウトしました。

と を使用して ArrayList を読み書きしようとしましたwriteTypedList(List<T> list)readTypedList(List<T> list, Creator<T> c)、どちらも機能していません。

trimToSize()ArrayLists を使用しているので、ArrayList の「空の」スロットが問題を引き起こす可能性があると考えたため、を使用して容量を実際のサイズに調整しました。しかし、繰り返しますが、そうではありません...

デバッガーでアプリを起動すると、マーシャリングされたStatStructHistoryものに空の値がないことが示されます...すべての属性またはリストアイテムが初期化されます。これNullPointerExceptionがどこから来ているのか、私にはわかりません。

よろしくhtz

4

1 に答える 1

0

parcelable のアンマーシャリングに関する問題

マーシャリングが成功したとしても、null 例外があるとアンマーシャリング プロセスが失敗する可能性があります。

デバッグの目的で、サブオブジェクトを 1 つずつマーシャリングしてみてください。それらのいずれかがエラーになるかどうかを確認してから、問題を掘り下げてください。現在、一度に 3 つのオブジェクトを非整列化しようとしていますが、どのオブジェクトに問題があるか (もしあれば) を特定するのは困難です。

明確でない場合は、これを試すことをお勧めします。

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

それが機能する場合は、次を試してください。

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

等...

于 2012-05-11T13:48:42.593 に答える