【问题标题】:Where does the Android Parcelable interface enforce the CREATOR objectAndroid Parcelable 接口在哪里强制执行 CREATOR 对象
【发布时间】:2013-11-23 16:26:14
【问题描述】:

我正在使用 Android 中的 Parcelables,我对这个错误感到好奇...

11-23 16:17:07.174: E/AndroidRuntime(1277): Caused by: 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 名称的位置。有人可以更好地解释一下吗?我想在我正在编写的其他代码中使用这种模式,所以我想知道是否有人可以解释它。

【问题讨论】:

    标签: java android parcelable


    【解决方案1】:

    这是在Parcel 类的方法public final &lt;T extends Parcelable&gt; Parcelable.Creator&lt;T&gt; readParcelableCreator() 中实现的。如果无法从指定的类加载器中获取创建者,则假定默认的 'CREATOR' 之一:

        ...
        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")在类中实现的字段。

    【讨论】:

      【解决方案2】:

      只是想我会就您看到的错误消息进行更新。

      这是造成这种情况的原因,但仍然由反射处理。

      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);
                      }
         ...
      }
      

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-16
        • 2015-08-29
        • 1970-01-01
        相关资源
        最近更新 更多