gpt4 book ai didi

java - Parcelable 协议(protocol)要求该类实现 Parcelable

转载 作者:太空宇宙 更新时间:2023-11-04 10:36:36 25 4
gpt4 key购买 nike

有时,我收到此错误,我不知道我的代码出了什么问题帮忙!

任何有帮助的建议代码。

这是我的错误报告:

com.example E/UncaughtException: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.MainActivity}: android.os.BadParcelableException: Parcelable protocol requires that the class implements Parcelable
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3319)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415)
at android.app.ActivityThread.access$1100(ActivityThread.java:229)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7325)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: android.os.BadParcelableException: Parcelable protocol requires that the class implements Parcelable
at android.os.Parcel.readParcelableCreator(Parcel.java:2407)
at android.os.Parcel.readParcelable(Parcel.java:2358)
at android.view.AbsSavedState.<init>(AbsSavedState.java:57)
at android.view.View$BaseSavedState.<init>(View.java:22902)
at com.example.DrawableViewSaveState.<init>(DrawableViewSaveState.java:17)
at com.example.DrawableViewSaveState$1.createFromParcel(DrawableViewSaveState.java:43)
at com.example.DrawableViewSaveState$1.createFromParcel(DrawableViewSaveState.java:41)

这是我的 DrawableViewSaveState 类:

当我想返回到使用 DrawableViewSaveState 类的 Activity 时,就会发生此错误。我总是在 super(in); 中遇到崩溃

public class DrawableViewSaveState extends View.BaseSavedState {

private ArrayList<SerializablePath> paths;

public DrawableViewSaveState(Parcel in) {
super(in); // I'm always getting the crash in this line of code.
this.paths = (ArrayList<SerializablePath>) in.readSerializable();
for (SerializablePath p : paths) {
p.loadPathPointsAsQuadTo();
}
}

public DrawableViewSaveState(Parcelable parcelable) {
super(parcelable);
}

@Override public void writeToParcel(Parcel dest, int flags) {
dest.writeSerializable(this.paths);
}

public ArrayList<SerializablePath> getPaths() {
return paths;
}

public void setPaths(ArrayList<SerializablePath> paths) {
this.paths = paths;
}

public static final Creator<DrawableViewSaveState> CREATOR =
new Creator<DrawableViewSaveState>() {
public DrawableViewSaveState createFromParcel(Parcel source) {
return new DrawableViewSaveState(source);
}

public DrawableViewSaveState[] newArray(int size) {
return new DrawableViewSaveState[size];
}
};
}

最佳答案

父类的构造函数尝试从Parcel中读取Parcelable。不幸的是(或者也许幸运的是——至少你避免了静默数据损坏!),Parcel 不包含预期的 Parcelable。

原因是因为你违反了父类的期望。从source code of AbsSavedState可以看出,接受 Parcel 的构造函数,期望看到由您的 DrawableViewSaveState(Parcelable Parcelable) 构造函数接收的 Parcelable,例如父 View 类的状态):

protected AbsSavedState(Parcel source) {
// FIXME need class loader
Parcelable superState = source.readParcelable(null);

mSuperState = superState != null ? superState : EMPTY_STATE;
}

该 Parcelable 是 written to Parcel通过您的父类(super class)的 writeToParcel(),但您没有调用它!

解决方案:将对 super.writeToParcel(dest, flags); 的调用添加到 writeToParcel 方法的开头。

future 的类(class):如果您继承自 Parcelable 类,请考虑从 writeToParcel 方法调用父类(super class)的 writeToParcel。

关于java - Parcelable 协议(protocol)要求该类实现 Parcelable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49395041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com