Android开发 - Parcel 类打包对象数据进行传递解析

Parcel 是什么

  • Parcel 是用于对象序列化反序列化的一个。通俗地说,它是一种轻量级容器,常用于打包对象的数据(如基本类型和其他 Parcelable 对象),使它们能够在不同的组件(如 Activity、Service 等)之间传递

Parcel的主要作用

  • 不同的组件(如 Activity、Service)之间需要传递数据。例如,在一个 Activity 启动另一个 Activity 时,可能需要传递一些数据,如字符串整数或者自定义对象Parcel 可以以一种非常高效的方式序列化这些数据,从而可以通过 Intent 等机制传递它们

Parcel 的工作原理

  • Parcel 的工作机制:它将数据序列化为二进制格式,然后将其打包到一个 Parcel 对象中。这个对象可以传递其他组件,其他组件接收到后再将数据从二进制格式反序列化回来,恢复成原始的对象

使用 Parcel 的好处

  • Parcel 的效率非常高,因为它不像 Serializable 那样需要进行大量反射操作Parcel 直接处理原始数据,因此更建议使用

Parcel 常用方法

  • parcel.write...() 方法:用于将数据写入 Parcel 对象。例如:
    • parcel.writeInt(int val):将一个整数写入 Parcel
    • parcel.writeString(String str):将一个字符串写入 Parcel
    • parcel.writeParcelable(Parcelable p, int flags):将一个 Parcelable 对象写入 Parcelflags 通常作为一个整数标记很少使用
  • parcel.read...() 方法:用于从 Parcel 对象读取数据。例如:
    • parcel.readInt():从 Parcel读取一个整数
    • parcel.readString():从 Parcel读取一个字符串
    • parcel.readParcelable(ClassLoader classLoader):从 Parcel读取一个 Parcelable 对象

代码示例

  • 假设有一个自定义对象 User,想要在两个 Activity 之间传递这个对象。需要将 User 对象序列化为 Parcel,然后传递下一个 Activity

    • 写入数据到 Parcel

      Parcel parcel = Parcel.obtain(); // 获取一个空的 Parcel 对象
      
      User user = new User("Alice", 30);
      user.writeToParcel(parcel, 0);  // 使用 User 类的 writeToParcel 方法将对象写入 Parcel
      
      parcel.setDataPosition(0);  // 重置 Parcel 的数据位置,以便读取
      
    • 从 Parcel 中读取数据

      User userFromParcel = User.CREATOR.createFromParcel(parcel);  // 使用 CREATOR 从 Parcel 中创建 User 对象
      

总结

  • Parcel 是特有的类:专门用于高效地序列化反序列化数据

  • Parcel 不进行类型检查:需要按照写入的顺序和类型读取数据

  • 比 Serializable 更高效Parcel直接操作内存中的数据没有额外的反射操作

posted @ 2024-08-29 11:17  阿俊学JAVA  阅读(17)  评论(0编辑  收藏  举报