enum 實現 Parcelable 接口

Parcelable是Android提供的序列化接口,對比Serializable它的使用方式更爲複雜,可是效率更高,常常用於AIDL通訊等。java

1、Parcelable 基本實現

//實現 Parcelable接口
public class Person implements android.os.Parcelable {
  private int age;
  private String name;
  
  @Override
  public int describeContents() {
    return 0;
  }

  @Override
  public void writeToParcel(Parcel dest, int flags) {
  	//按照順序寫入
    dest.writeInt(this.age);
    dest.writeString(this.name);
  }

  public Person() {
  }

  protected Person(Parcel in) {
    //按照保存順序進行獲取
    this.age = in.readInt();
    this.name = in.readString();
  }

  public static final Creator<Person> CREATOR = new Creator<Person>() {
    @Override
    public Person createFromParcel(Parcel source) {
      //從 Parcel 中建立一個Person
      return new Person(source);
    }

    @Override
    public Person[] newArray(int size) {
      return new Person[size];
    }
  };
}

複製代碼

重要的是下面兩個方法:android

writeToParcel():將變量寫入 Parcel,進行序列化markdown

createFromParcel():從 Parcel 中建立序列化的對象ide

若是以爲操做麻煩,還有一種簡單的作法:ui

  1. 在 Android Studio 中添加 Android Parcelable code generator 這個插件。
  2. 打開這個類,使用 Alt+Insert,最後點擊 Parcelbale 便可。

2、enum 實現 Parcelable 接口

當你建立一個枚舉,想要使用上述插件時,就會發現沒法序列號。這個是由於 Parcel.writeXXX 沒有寫入枚舉的方法,因此沒法直接實現 Parcelablethis

這個時候,咱們只須要定義一個轉換規則,將枚舉轉換爲 Parcel 能夠寫入的類型,而且支持從 Parcel 獲取變量找到對應的枚舉便可。spa

public enum Fruit implements Parcelable {
  /** * 水果 */
  APPLE,
  BANANA,
  WATERMELON;

  @Override
  public int describeContents() {
    return 0;
  }

  @Override
  public void writeToParcel(Parcel dest, int flags) {
    //存入枚舉常量的序數
    dest.writeInt(ordinal());
  }
  public static final Creator<Fruit> CREATOR = new Creator<Fruit>() {
    @Override
    public Fruit createFromParcel(Parcel in) {
      //經過枚舉常量的序數找到對應的枚舉類型
      return Fruit.values()[in.readInt()];
    }

    @Override
    public Fruit[] newArray(int size) {
      return new Fruit[size];
    }
  };  
}
複製代碼
相關文章
相關標籤/搜索