Trong dự án của tôi, tôi có một mô hình lưu giữ thông tin cơ bản về mô hình. Ví dụ, cho phép nói rằng mô hình là một chiếc xe hơi. Sau đó, có rất nhiều loại xe khác nhau và chúng có dữ liệu khác nhau được gán cho chúng. Tất cả các mô hình phải là bưu kiện.Khớp nối bên trong gói được thêm vào Bưu kiện
Sự khác biệt giữa các loại xe khác nhau là rất nhỏ, nó có thể chỉ là một vài trường dữ liệu. Vì vậy, điều này được giải quyết bằng cách tạo ra diễn giả (chỉ là một lớp chứa dữ liệu) cho những chiếc xe khác nhau. Người trình bày sau đó sẽ biết thêm dữ liệu nào cần lưu giữ. Bởi vì bản thân người trình bày không thể chuyển nhượng được, nó sẽ có một gói cho tất cả các dữ liệu của nó, sau đó lớp Car sau đó sẽ thêm vào bưu kiện. Tôi không muốn biến các diễn giả thành bưu kiện.
Vì vậy, Xe đưa Bundle từ người dẫn chương trình và đặt nó trong bưu kiện của nó:
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeBundle(getPresenter().getBundle());
}
Và sau đó nó sẽ giải nén nó với:
public Car(Parcel parcel) {
getPresenter().setBundle(parcel.readBundle());
}
này hoạt động tốt cho đến khi một đối tượng parcelable được thêm cho nhóm bởi người trình bày. Sau đó, tôi nhận được lỗi này:
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
Vì vậy, bằng cách nào đó, không đọc được gì từ Gói.
Điều này có thể được giải quyết bằng cách thay đổi các cuộc gọi readBundle tới:
public Car(Parcel parcel) {
getPresenter().setBundle(parcel.readBundle(engine.class.getClassLoader()));
}
Tuy nhiên, điều này sẽ không có nghĩa là tôi chỉ có thể có một loại parcelables trong bó của tôi? Ví dụ: nếu người trình bày khác muốn thêm một đối tượng có thể đặt hàng khác vào nhóm được thì sao?
Có ai có thể làm sáng tỏ điều này không?
Tôi biết những điều cơ bản về bưu kiện và nó đang hoạt động ở mọi nơi khác trong ứng dụng của tôi. Engine thực thi Parcelable. Vấn đề là nếu tôi đặt một kiện trong một bó, và sau đó các gói trong một bưu kiện, tôi không thể giải nén các hình thức có thể thửa gói (hoặc bất kỳ lĩnh vực khác trong gói). – Heinrisch
Có, tôi đã thử điều đó và tôi nghĩ rằng nó không hoạt động. Tuy nhiên, câu hỏi của tôi đã được ment để được nhiều hơn lý do tại sao tôi thậm chí phải chỉ định một bộ nạp lớp trong trường hợp này. – Heinrisch
Tôi đã cập nhật câu trả lời của mình. –