Android开发 - Creator 类从 Parcel 中创建新的对象解析
Creator 是什么
- Creator 是用于 Parcelable 接口的一个辅助工具,它帮助我们从 Parcel 中创建新的对象。简单来说,Creator 是一个工厂类,用于生成新的对象实例
为什么需要 Creator
- 如果想要让一个对象在不同组件(如 Activity、Service 等)之间传递,该对象必须实现 Parcelable 接口。实现 Parcelable 接口的类需要有一个 CREATOR 字段,这个字段是
Parcelable.Creator<T>
的一个实现,用于告诉 Android 系统如何创建这个类的实例
Creator 的工作流程
-
Creator 是一个静态字段,通常在实现 Parcelable 接口的类中定义。它实现了
Parcelable.Creator<T>
接口,该接口包含两个方法:-
createFromParcel(Parcel in)
:从给定的 Parcel 中读取数据并返回一个新的对象实例 -
newArray(int size)
:创建一个指定大小的对象数组
-
Creator 示例
public class User implements Parcelable {
private String name;
private int age;
// 普通的构造函数
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 从 Parcel 中读取数据的构造函数
protected User(Parcel in) {
name = in.readString(); // 从 Parcel 中读取 String 类型的数据并赋值给 name 字段
age = in.readInt(); // 从 Parcel 中读取 int 类型的数据并赋值给 age 字段
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name); // 将 name 字段写入到 Parcel 中
dest.writeInt(age); // 将 age 字段写入到 Parcel 中
}
@Override
public int describeContents() {
return 0; // 通常返回 0,表示对象包含的是文件描述符
}
// 定义 CREATOR 字段,它是 Parcelable.Creator<User> 的一个实现
// 它告诉 Android 系统如何从 Parcel 中恢复对象
public static final Creator<User> CREATOR = new Creator<User>() {
// 使用 Parcel 中的数据创建一个新的 User 对象。在我们的例子中,它调用了 User(Parcel in) 构造函数,通过从 Parcel 中读取的数据来初始化新对象
@Override
public User createFromParcel(Parcel in) {
return new User(in); // 从 Parcel 中读取数据并创建 User 对象
}
// 创建一个 User 对象的数组,大小为 size
@Override
public User[] newArray(int size) {
return new User[size]; // 创建一个指定大小的 User 数组
}
};
}
Creator 的好处
-
反序列化对象:把对象从一个 Activity 传递到另一个 Activity 时,Android 系统需要反序列化对象。CREATOR 帮助 Android 系统知道如何从 Parcel 中重建原始对象
-
类型安全:CREATOR 确保在反序列化时不会丢失数据类型和数据内容
总结
- Creator 是 Parcelable 的一部分,它告诉 Android 系统如何序列化和反序列化一个对象。通过实现
Parcelable.Creator<T>
接口,我们定义了如何从 Parcel 创建新的对象实例,使得对象可以在组件之间高效地传递