【发布时间】:2012-11-05 11:21:16
【问题描述】:
在我的项目中,我有一个模型,其中包含有关模型的基本信息。例如,假设模型是汽车。然后有许多不同种类的汽车,它们分配了不同的数据。所有模型都必须是 parcelables。
不同车型之间的差异很小,可能只是几个数据字段。因此,这是通过为不同的汽车创建演示者(只是一个保存数据的类)来解决的。然后演示者将知道它应该保存哪些额外数据。因为演示者本身是不可打包的,所以它的所有数据都会有一个 Bundle,然后 Car 类将添加到 Parcelable 中。我不想让演示者变成 Parcelables。
所以 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()));
}
但是,这是否意味着我的包裹中只能包含一种类型的包裹?例如,如果另一个演示者想要将另一个可打包对象添加到捆绑包中怎么办?
有人能解释一下吗?
【问题讨论】:
标签: android parcelable