Parcelable writeXXX 与 writeBundle
Parcelable writeXXX versus writeBundle
在实现 Parcelable 接口时,我总是很难理解指南的要点。
举个简单的例子,当我的 Parcelable
对象只有 3 个字段时:String
、boolean
和 List
.
有用的代码应该如下所示:
private String myString;
private boolean myBool;
private List<String> myList
private MyParcelableObject(Parcel in) {
myString = in.readString();
myBool = in.readByte() != 0;
myList = in.readArrayList(String.class.getClassLoader());
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(myString);
dest.writeByte((byte) (myBool ? 1 : 0));
dest.writeList(myList);
}
然而,这种基于顺序的注册对我来说似乎很奇怪。
但是既然可以给包裹写一个Bundle
,为什么不这样写呢?
private final static String KEY_STR = "key_str",
KEY_BOOL = "key_bool",
KEY_LIST = "key_list";
private MyParcelableObject(Parcel in) {
Bundle b =in.readreadBundle(Bundle.class.getClassLoader());
myString = b.getString(KEY_STR);
myBool = b.putBoolean(KEY_BOOL);
myList = b.getStringArrayList(KEY_LIST);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
Bundle b = new Bundle();
b.putString(KEY_STR, myString);
b.putBoolean(KEY_BOOL, myBool);
b.putStringArrayList(KEY_LIST, myList);
dest.writeBundle(b);
}
订单注册现在是key注册,Parcel有Bundle没有的方法好像很少
但是由于第一种方式在网络上(以及官方 javadoc 中)最为常见,我认为这是 "good" 方式,那么与第二种方式相比它有什么好处?
Parcelable 比 Bundle 更高效。
正是因为 Parcelable 对字段的排序很严格,所以不需要太多逻辑来读取它们,因此非常快。相比之下,Bundle 在它可以包含的内容方面非常灵活,从中读取意味着它需要更多的逻辑来支持灵活性并且速度较慢。当您将 Bundle 放入 Parcelable 中时,Parcelable 将失去其性能优势。
以上说法并不完全正确。您可以将任何您想要的逻辑构建到一个 Parcelable 中,因此您可以对其进行编程,使其具有您想要的或多或少的灵活性,从而选择您自己的性能权衡。但这是以增加代码复杂性和可能的错误为代价的。这似乎不是一个好的选择,而且我认为,走这条路的人并不多。
给你更多思考:Android也支持标准的JavaSerializable
接口。对于只有原始类型或其他可序列化类型的字段的 classes,这通常是一个很好的选择。在那种情况下,您只需在 class 上添加 implements Serializable
即可,但仍然不如 Parcelables 快。
在做出关于性能的决定之前请记住:在优化任何东西之前先测量它,因为性能可能已经足够好以达到您的目的。
在实现 Parcelable 接口时,我总是很难理解指南的要点。
举个简单的例子,当我的 Parcelable
对象只有 3 个字段时:String
、boolean
和 List
.
有用的代码应该如下所示:
private String myString;
private boolean myBool;
private List<String> myList
private MyParcelableObject(Parcel in) {
myString = in.readString();
myBool = in.readByte() != 0;
myList = in.readArrayList(String.class.getClassLoader());
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(myString);
dest.writeByte((byte) (myBool ? 1 : 0));
dest.writeList(myList);
}
然而,这种基于顺序的注册对我来说似乎很奇怪。
但是既然可以给包裹写一个Bundle
,为什么不这样写呢?
private final static String KEY_STR = "key_str",
KEY_BOOL = "key_bool",
KEY_LIST = "key_list";
private MyParcelableObject(Parcel in) {
Bundle b =in.readreadBundle(Bundle.class.getClassLoader());
myString = b.getString(KEY_STR);
myBool = b.putBoolean(KEY_BOOL);
myList = b.getStringArrayList(KEY_LIST);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
Bundle b = new Bundle();
b.putString(KEY_STR, myString);
b.putBoolean(KEY_BOOL, myBool);
b.putStringArrayList(KEY_LIST, myList);
dest.writeBundle(b);
}
订单注册现在是key注册,Parcel有Bundle没有的方法好像很少
但是由于第一种方式在网络上(以及官方 javadoc 中)最为常见,我认为这是 "good" 方式,那么与第二种方式相比它有什么好处?
Parcelable 比 Bundle 更高效。
正是因为 Parcelable 对字段的排序很严格,所以不需要太多逻辑来读取它们,因此非常快。相比之下,Bundle 在它可以包含的内容方面非常灵活,从中读取意味着它需要更多的逻辑来支持灵活性并且速度较慢。当您将 Bundle 放入 Parcelable 中时,Parcelable 将失去其性能优势。
以上说法并不完全正确。您可以将任何您想要的逻辑构建到一个 Parcelable 中,因此您可以对其进行编程,使其具有您想要的或多或少的灵活性,从而选择您自己的性能权衡。但这是以增加代码复杂性和可能的错误为代价的。这似乎不是一个好的选择,而且我认为,走这条路的人并不多。
给你更多思考:Android也支持标准的JavaSerializable
接口。对于只有原始类型或其他可序列化类型的字段的 classes,这通常是一个很好的选择。在那种情况下,您只需在 class 上添加 implements Serializable
即可,但仍然不如 Parcelables 快。
在做出关于性能的决定之前请记住:在优化任何东西之前先测量它,因为性能可能已经足够好以达到您的目的。