在我的Android應用程序中,我基本上有一個類實現Parcelable
,其中一個字段需要從Parcel
中讀取並寫入Parcel
是對抽象類的引用,它也實現Parcelable
。我應該如何使用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
不會工作,因爲這個類不應該知道具體的實現。它應該是某種工廠模式嗎?
哎呀,看起來像我'ClassLoader'困惑'Class'。謝謝你的幫助! –
@CharlesSpencer無後顧之憂。很高興我能幫上忙。 –