美文网首页
enum 实现 Parcelable 接口

enum 实现 Parcelable 接口

作者: 一个不安分的Android开发 | 来源:发表于2021-02-21 20:25 被阅读0次

    Parcelable是Android提供的序列化接口,对比Serializable它的使用方式更为复杂,但是效率更高,经常用于AIDL通信等。

    一、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];
        }
      };
    }
    
    

    重要的是下面两个方法:

    writeToParcel():将变量写入 Parcel,进行序列化

    createFromParcel():从 Parcel 中创建序列化的对象

    如果觉得操作麻烦,还有一种简单的做法:

    1. 在 Android Studio 中添加 Android Parcelable code generator 这个插件。
    2. 打开这个类,使用 Alt+Insert,最后点击 Parcelbale 即可。
    插件.png

    二、enum实现Parcelable接口

    当你创建一个枚举,想要使用上述插件时,就会发现无法序列号。这个是因为 Parcel.writeXXX 没有写入枚举的方法,所以无法直接实现 Parcelable

    这个时候,我们只需要定义一个转换规则,将枚举转换为 Parcel 可以写入的类型,并且支持从 Parcel 获取变量找到对应的枚举即可。

    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];
        }
      };  
    }
    

    相关文章

      网友评论

          本文标题:enum 实现 Parcelable 接口

          本文链接:https://www.haomeiwen.com/subject/cnzqfltx.html