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 确保在反序列化不会丢失数据类型和数据内容

总结

  • CreatorParcelable 的一部分,它告诉 Android 系统如何序列化和反序列化一个对象。通过实现 Parcelable.Creator<T> 接口,我们定义了如何从 Parcel 创建新的对象实例,使得对象可以在组件之间高效地传递
posted @ 2024-08-29 14:11  阿俊学JAVA  阅读(55)  评论(0编辑  收藏  举报