在我的项目中,我有一个包含有关模型的基本信息的模型。例如,可以说模型是一辆汽车。然后有许多不同的汽车品种,这些汽车有不同的数据分配给他们。所有模型必须是可接受的。添加到包裹中的可编辑的内部包裹
不同车型之间的差异很小,可能只是一些数据领域。所以这可以通过为不同的汽车创建演示者(只是一个保存数据的类)来解决。演示者会知道应该保存哪些额外的数据。因为演示者本身不可分类,所以它的所有数据都会有一个Bundle,然后Car类将添加到可分类中。我不想让演示者变成可以包装的东西。
因此汽车从演讲者采取捆绑,并把它放在其包裹:
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeBundle(getPresenter().getBundle());
}
,然后它会用它解:
public Car(Parcel parcel) {
getPresenter().setBundle(parcel.readBundle());
}
这工作得很好,直到parcelable对象添加由演示者提供给包。 后来我得到这个错误:
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
所以它在某种程度上无法读取从包东西。
public Car(Parcel parcel) {
getPresenter().setBundle(parcel.readBundle(engine.class.getClassLoader()));
}
然而,就不是这个意思,我只能有一种类型,我捆绑Parcelables并的:
这可以通过修改readBundle呼叫被解决了吗?例如,如果另一个演示者想要将另一个可分段对象添加到该包中呢?
任何人都可以对此有所了解吗?
我知道包裹的基础,并在我的应用程序工作在其他地方。引擎确实实现了Parcelable。问题是,如果我将一个parcelable放入一个包中,然后将这个包放入一个parcel中,那么我无法解压该包(或bundle中的任何其他字段)的可放入表单。 – Heinrisch
是的,我已经尝试过,我认为它没有工作。然而,我的问题是,为什么我甚至不得不在这种情况下指定一个类加载器。 – Heinrisch
我已经更新了我的答案。 –