私のプロジェクトには、モデルに関する基本的な情報を保持するモデルがあります。たとえば、モデルが車であるとします。次に、車にはさまざまな種類があり、これらにはさまざまなデータが割り当てられています。すべてのモデルはパーセル可能である必要があります。
異なる車の間の違いは非常に小さく、それはほんのいくつかのデータフィールドかもしれません。したがって、これは、さまざまな車のプレゼンター(データを保持するクラス)を作成することで解決されます。プレゼンターは、保持する必要のある追加データを知ることができます。プレゼンター自体はパーセル可能ではないため、すべてのデータのバンドルがあり、Carクラスがパーセル可能に追加します。プレゼンターを小包にしたくありません。
したがって、Carはプレゼンターからバンドルを取得し、その区画に入れます。
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeBundle(getPresenter().getBundle());
}
そしてそれはそれからそれを開梱します:
public Car(Parcel parcel) {
getPresenter().setBundle(parcel.readBundle());
}
これは、パーセル可能なオブジェクトがプレゼンターによってバンドルに追加されるまで正常に機能します。次に、このエラーが発生します。
11-16 15:06:37.255: E/AndroidRuntime(15193): FATAL EXCEPTION: main
11-16 15:06:37.255: E/AndroidRuntime(15193): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.activity}: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.example.model.engine
11-16 15:06:37.255: E/AndroidRuntime(15193): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2185)
11-16 15:06:37.255: E/AndroidRuntime(15193): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2210)
11-16 15:06:37.255: E/AndroidRuntime(15193): at android.app.ActivityThread.access$600(ActivityThread.java:142)
11-16 15:06:37.255: E/AndroidRuntime(15193): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208)
11-16 15:06:37.255: E/AndroidRuntime(15193): at android.os.Handler.dispatchMessage(Handler.java:99)
11-16 15:06:37.255: E/AndroidRuntime(15193): at android.os.Looper.loop(Looper.java:137)
11-16 15:06:37.255: E/AndroidRuntime(15193): at android.app.ActivityThread.main(ActivityThread.java:4931)
11-16 15:06:37.255: E/AndroidRuntime(15193): at java.lang.reflect.Method.invokeNative(Native Method)
11-16 15:06:37.255: E/AndroidRuntime(15193): at java.lang.reflect.Method.invoke(Method.java:511)
11-16 15:06:37.255: E/AndroidRuntime(15193): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
11-16 15:06:37.255: E/AndroidRuntime(15193): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
11-16 15:06:37.255: E/AndroidRuntime(15193): at dalvik.system.NativeStart.main(Native Method)
11-16 15:06:37.255: E/AndroidRuntime(15193): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.example.model.engine
11-16 15:06:37.255: E/AndroidRuntime(15193): at android.os.Parcel.readParcelable(Parcel.java:2077)
11-16 15:06:37.255: E/AndroidRuntime(15193): at android.os.Parcel.readValue(Parcel.java:1965)
11-16 15:06:37.255: E/AndroidRuntime(15193): at android.os.Parcel.readMapInternal(Parcel.java:2226)
11-16 15:06:37.255: E/AndroidRuntime(15193): at android.os.Bundle.unparcel(Bundle.java:223)
11-16 15:06:37.255: E/AndroidRuntime(15193): at android.os.Bundle.getString(Bundle.java:1055)
11-16 15:06:37.255: E/AndroidRuntime(15193): at com.example.cars.CarPresenter.getExtraString(CarPresenter.java:34)
11-16 15:06:37.255: E/AndroidRuntime(15193): ... 11 more
したがって、どういうわけか、バンドルから何かを読み取ることができません。
これは、readBundle呼び出しを次のように変更することで解決できます。
public Car(Parcel parcel) {
getPresenter().setBundle(parcel.readBundle(engine.class.getClassLoader()));
}
しかし、これは、バンドルに1種類の小包しか入れられなかったことを意味するのではないでしょうか。たとえば、別のプレゼンターが別のパーセル可能なオブジェクトをバンドルに追加したい場合はどうなりますか?
誰かがこれに光を当てることができますか?