Android開發 - Creator 類從 Parcel 中建立新的物件解析

阿俊学JAVA發表於2024-08-29

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 建立新的物件例項,使得物件可以在元件之間高效地傳遞

相關文章