在我的Android应用程序中,我基本上只有一个实现Parcelable的类,并且需要从其中读取和写入Parcel的其字段之一是对也实现Parcelable的抽象类的引用。

这是抽象类及其具体实现之一:

public abstract AbstractClass1 implements Parcelable {
}

public class ConcreteClass1 extends AbstractClass1 {
    private ConcreteClass1(Parcel in) {
        this.setSomeData(in.readInt());
    }

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

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

    @Override
    public int describeContents() { return 0; }

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


到目前为止,这是我需要给其他Parcelable类读取和写入对AbstractClass1的引用到其Parcel中的内容。我不确定如何使CREATOR工作:

public Class2 implements Parcelable {
    private int data = 42;
    private AbstractClass1 class1;

    public Class2(AbstractClass1 c) { this.class1 = c; }

    private Class2(Parcel in) {
        this.data = in.readInt();

        // this line is bad since it requires us to know about
        // what concrete class is being set for class1.  This
        // class should only need to be aware of AbstractClass1
        this.class1 = in.readParcelable(ConcreteClass1.class);
    }

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

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

    @Override
    public int describeContents() { return 0; }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.data);
        dest.writeInt(this.class1);
    }
}


是否有关于使用Parcelable处理此抽象类问题的最佳实践?我知道Parcelable并不是要用于序列化的通用工具,但是对于许多应用程序来说,这似乎是一个重要问题,因此至关重要的是,必须使Parcelable正常工作,以防用户使用按下返回按钮,然后要返回到应用程序,因为需要保存应用程序的状态。我对CREATOR的特殊AbstractClass1也不起作用,因为此类不应该了解具体的实现。应该是某种工厂模式吗?

最佳答案

方法writeParcelable(Parcelable, int)将相应的非抽象类的名称写入Parcel(以及您在writeToParcel方法中写入的数据)。

相反的是readParcelable(null)readParcelable首先读回该类的名称,以便随后可以在调用CreatorCreator方法之前从该类中获取正确的createFromParcel对象。

readParcelable的参数不是Class而是ClassLoader。如果通过null,则使用默认的ClassLoader

关于java - 我应该如何将Parcelable用于抽象类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32941456/

10-10 23:45