在我的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
首先读回该类的名称,以便随后可以在调用Creator
的Creator
方法之前从该类中获取正确的createFromParcel
对象。readParcelable
的参数不是Class
而是ClassLoader
。如果通过null
,则使用默认的ClassLoader
。
关于java - 我应该如何将Parcelable用于抽象类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32941456/