2013-11-23 22 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); 
       } 
    ... 
}