В моем проекте у меня есть модель, которая содержит основную информацию о модели. Например, скажем, что модель является автомобилем. Кроме того, есть много разных разновидностей автомобилей, и им присвоены разные данные. Все модели должны быть разделены.
Различий между разными автомобилями очень мало, это может быть всего несколько полей данных. Так что это решается созданием презентаторов (просто класс, который содержит данные) для разных автомобилей. Затем ведущий будет знать, какие дополнительные данные он должен хранить. Поскольку сам презентатор не подлежит разделению, он будет иметь Bundle для всех своих данных, которые затем класс Car добавит к разделяемому. Я не хочу превращать докладчиков в посылок.
Итак, Автомобиль берет у ведущего Bundle и кладет его в свою посылку:
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
Таким образом, он почему-то не может ничего прочитать из Bundle.
Это можно решить, изменив вызов readBundle на:
public Car(Parcel parcel) {
getPresenter().setBundle(parcel.readBundle(engine.class.getClassLoader()));
}
Однако не означает ли это, что в моей связке может быть только один тип посылок? Например, что, если другой докладчик захочет добавить в пакет еще один предмет, который можно разделить?
Может ли кто-нибудь пролить свет на это?