还原视图当解组父视图SavedState时,SavedState会抛出ClassNotFoundException

nem*_*zis 6 android savestate parcel parcelable

我有2个班级ParentClassChildClass:

ParentClass 是RelativeLayout的子类,它使用onSaveInstanceState()/ onRestoreInstanceState()使用以下代码保存状态:

@Override
protected Parcelable onSaveInstanceState() {
    SavedState savedState = new SavedState(super.onSaveInstanceState());
    savedState.someObj = someObj;
    savedState.someInt = someInt;
    savedState.someEnum = someEnum;
    return savedState;
}

@Override
protected void onRestoreInstanceState(Parcelable in) {
    if (!(in instanceof SavedState)) {
        super.onRestoreInstanceState(in);
        return;
    }
    SavedState savedState = (SavedState) in;
    super.onRestoreInstanceState(savedState.getSuperState());
    this.someObj = savedState.someObj;
    this.someInt = savedState.someInt;
    this.someEnum = savedState.someEnum;
}
Run Code Online (Sandbox Code Playgroud)

以下是SavedState代码:

public static class SavedState extends BaseSavedState {

    private SomeObj someObj;
    private int someInt;
    private SomeEnum someEnum;

    public SavedState(Parcelable superState) {
        super(superState);
    }

    public SavedState(Parcel source) {
        super(source);
        someInt = source.readInt();
        someEnum = SomeEnum.values()[source.readInt()];
        someObj = source.readParcelable(SomeObj.class.getClassLoader());
    }

    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeInt(someInt);
        dest.writeInt(someEnum.ordinal());
        dest.writeParcelable(someObj, flags);
    }

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

        public SavedState[] newArray(int size) {
            return new SavedState[size];
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

没有什么花哨的,当我直接使用这个视图时,一切都按预期工作(保存\恢复状态).

然后我有ChildClass扩展ParentClass它也使用完全相同的代码保存状态,除了我只保存long和int字段.

当应用程序试图恢复ChildClass通过调用它的视图状态SavedState的构造与ParcelCREATOR它下面的堆栈崩溃:

Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.company.app.ParentClass$SavedState
1   android.os.Parcel.readParcelableCreator Parcel.java, line 2320
2   android.os.Parcel.readParcelable    Parcel.java, line 2270
3   android.view.AbsSavedState.<init>   AbsSavedState.java, line 57
4   android.view.View$BaseSavedState.<init> View.java, line 20128
5   com.company.app.ChildClass$SavedState.<init>    ChildClass.java, line 151
6   com.company.app.ChildClass$SavedState$1.a   ChildClass.java, line 166
7   com.company.app.ChildClass$SavedState$1.createFromParcel ChildClass.java, line 164
Run Code Online (Sandbox Code Playgroud)

Vik*_*alp -2

让你的SavedState类实现Parcelable

public static class SavedState extends Parcelable {
Run Code Online (Sandbox Code Playgroud)

  • `SavedState` 扩展了 `BaseSavedState`,后者扩展了实现 `Parcelable` 的 `AbsSavedState`,所以我认为这不会有帮助 (2认同)