2015-10-05 204 views
2

在我的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工作,以防用戶按下後退按鈕然後想要返回到應用程序,因爲應用程序的狀態需要保存。我特別CREATORAbstractClass1不會工作,因爲這個類不應該知道具體的實現。它應該是某種工廠模式嗎?

回答

1

方法writeParcelable(Parcelable, int)將適當的非抽象類的名稱寫入Parcel(以及您在writeToParcel方法中編寫的數據)。

與此相反的是readParcelable(null)readParcelable首先讀取類的名稱,然後才能在調用CreatorcreateFromParcel方法之前從該類中獲取正確的Creator對象。

readParcelable的參數不是Class而是ClassLoader。如果您通過null,則使用默認的ClassLoader

+0

哎呀,看起來像我'ClassLoader'困惑'Class'。謝謝你的幫助! –

+0

@CharlesSpencer無後顧之憂。很高興我能幫上忙。 –

相關問題