实施 Parcelable 的正确方法

Correct way of implementing Parcelable

在Android中实现Parcelable接口的正确方法是什么?根据文档,您应该实施 writeToParcel 方法并具有 CREATOR.

public void writeToParcel(Parcel out, int flags) {
     out.writeInt(mData);
 }

但是当我在不添加 CREATOR 并将 writeToParcel() 留空的情况下实施它时,应用程序似乎仍然可以正常工作。有时我会得到 Bad Parcelable Exception 但我无法计算出复制的步骤。

这就是我用来将对象从 activity 传递到片段

的方式
 Bundle bundle = new Bundle();
 bundle.putParcelable(PageFragment.PAGE_FILTER_KEY, page);
 fragment.setArguments(bundle);

那么,添加 out.writeInt(mData); 之类的内容的目的是什么?如果不这样做,会出现什么样的问题?

But when I implement it without adding a CREATOR and leaving the writeToParcel() empty the app still seems to work correctly.

CREATOR 用于从 Parcel 中读回数据并将其转换回对象。

writeToParcel() 将您的数据放入 Parcel.

如果您的 Parcelable 实际上没有被放入 Parcel 或从 Parcel 中重组,那么将它们关闭的唯一方法将正常工作。示例包括 LocalBroadcastManager.

what is the purpose of adding stuff like out.writeInt(mData);

这与添加 out.write()OutputStream 的目的相同:它写入输出。你的问题类似于问 "hey, if I don't write data to my file, what sorts of problems will I encounter?".

Parcelable 实现主要有两个流程步骤。

1 将您的 java 对象写入包含两个方法的 Parcel.

  @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(cityName);
        dest.writeString(macroName);
        dest.writeString(id);
    }

其中 describe content 用于为您的内容设置标志。大多数时候你只需要保持原状。

public void writeToParcel(Parcel dest, int flags) ,你需要根据JAVA中的字段一步步写你Java class对象到parcel class。在上面的例子中,我的 class 有三个字符串。您几乎可以在 parcel 中写入所有类型的对象。你只需要选择一个合适的。如 writeString(),writeList() 或 writeObject() 等

2。第二部分是从 parcel

读取你的 java 对象

这部分还需要做两件事。首先是您的 java class 的 CREATOR,如下所示

 public static final Creator<City> CREATOR = new Creator<City>() {
        @Override
        public City createFromParcel(Parcel in) {
            return new City(in);
        }

        @Override
        public City[] newArray(int size) {
            return new City[size];
        }
    };

在上面的示例中,我的 Java class 是城市。它从包裹中读取一个城市对象。但是它调用了 City class 的 new City(in) 构造函数。所以现在我需要一个在参数中接受包裹对象的构造函数。让我们也创建它..

 protected City(Parcel in) {
        cityName = in.readString();
        macroName = in.readString();
        id = in.readString();
    }

现在我们制作一个 class 完整的可打包证明。需要注意的一件事,我们需要在 protected City(Parcel in) 中以相同的顺序读取成员,我们将它们放在包裹中,即在 writeToParcel() 方法中。

关于如何通过简单地让 android 从 parcelable 创建 java 对象来重现 badParcelable 异常。为此,您可以在 android 设备上的开发人员选项中选择“销毁活动”,然后将您的应用程序置于 activity 的后台,这样 android 就可以终止您的应用程序进程 ID。通过重新创建 activity (onCreate + Bundle) 恢复您的应用程序,如果您没有正确实施 parcelable,您将得到该异常。