2013-11-23 72 views
2

我與Parcelables並在Android的工作,我很好奇這個錯誤...哪裏了Android Parcelable接口執行CREATOR對象

11-23 16:17:07.174:E/AndroidRuntime(1277 ):由:android.os.BadParcelableException:Parcelable協議需要在階級com.gleason.apahelper.model.PlayerTeam名爲CREATOR一個Parcelable.Creator對象

當然,這是因爲我缺少這個...

public static final Parcelable.Creator<Player> CREATOR = new Parcelable.Creator<Player>() { 
    public Player createFromParcel(Parcel in) { 
     return new Player(in); 
    } 
    public Player[] newArray(int size) { 
     return new Player[size]; 
    } 
}; 

我的問題是,當我看到代碼here我不知道它如何確保您有CREATOR對象。我可以看到需要接口的位置,但我看不到它需要CREATOR名稱。有人可以解釋這個好一點嗎?我想在我寫的其他代碼中使用這種模式,所以我想知道是否有人可以解釋它。

回答

1

這是在方法public final <T extends Parcelable> Parcelable.Creator<T> readParcelableCreator()Parcel類中實現的。如果不能得到從指定的類加載器的創造者,它假設默認的「創作者之一:

... 
    Parcelable.Creator<T> creator; 
    synchronized (mCreators) { 
     HashMap<String,Parcelable.Creator> map = mCreators.get(loader); 
     if (map == null) { 
      map = new HashMap<String,Parcelable.Creator>(); 
      mCreators.put(loader, map); 
     } 
     creator = map.get(name); 
     if (creator == null) { 
      try { 
       Class c = loader == null ? 
        Class.forName(name) : Class.forName(name, true, loader); 
       Field f = c.getField("CREATOR"); 
       creator = (Parcelable.Creator)f.get(null); 
      } 
... 

編輯:忘了提,該方法使用反射來獲取一個字段在類中實現使用c.getField("CREATOR")

0

只是想我會給你看到的錯誤消息的更新。

以下是對此負有責任的一點,仍然全部由反射處理。

public final Parcelable.Creator<?> readParcelableCreator(ClassLoader loader) { 
    ... 
       Field f = parcelableClass.getField("CREATOR"); 
       if ((f.getModifiers() & Modifier.STATIC) == 0) { 
        throw new BadParcelableException("Parcelable protocol requires " 
          + "the CREATOR object to be static on class " + name); 
       } 
    ... 
}