实施 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,您将得到该异常。
在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,您将得到该异常。