美文网首页
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 接口

    Parcelable是Android提供的序列化接口,对比Serializable它的使用方式更为复杂,但是效率更...

  • Parcelable对象/数据序列化

    一、Parcelable详解 (1)Parcelable的实现类Parcelable接口的实现类是可以通过Parc...

  • 我用过的一些插件

    as插件 Android Parcelable code generator 生成实现了Parcelable接口的...

  • Android 插件

    android parcelable code generator 自动化快速实现Parcelable接口序...

  • AS常用插件

    1.Android Parcelable Code Generator 自动实现Parcelable接口 2.An...

  • AIDL详解

    aidl支持基本数据类型和实现了parcelable接口的对象。 ps:实现了parcelable接口的对象的文件...

  • 序列化和反序列化笔记2

    Android中通过Parcelable实现序列化 Parcelable是一个接口,只要实现这个接口,一个类对象就...

  • Parcelable&Serializable序列化使用

    Parcelable序列化接口使用## 首先先实现Parcelable接口 以下是JavaBean的代码片段 Se...

  • 【Android 基础】 序列化 Parcelable 使用

    Android 序列化对象方法: 实现Serializable接口,Java自带; 实现Parcelable接口,...

  • 序列化

    Parcelable Parcelable是一个接口,只要实现这个接口,该类的对象就可以实现序列化。序列化:由wr...

网友评论

      本文标题:enum 实现 Parcelable 接口

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