Android parcel 机制
1. Serialize 说起
Java中的Serialize机制, 串行化机制,效率较慢:
- 使用的反射机制
- 会生成很多临时文件,造成了垃圾回收
将数据对象存入字节流中,在需要时重新生成对象.应用外部存储器保存对象状态,以及通过网络传输对象等.
串行化: 将对象转化成字节流,保存在存储设备\内存或二进制方式通过网络传输. 之后通过反串行化从连续的字节数据重新构建一个原始对象状态相同的对象.
2. Parcel 简介
Android工程师新设计了Parcel机制, 定位于轻量级的高效串行化和反串行化. 字节流主要保存在内存中, 用于IPC通信.
3. Parcel 机制详解
3.1. 源码位置
Frameworks/base/core/java/android/os/Parcel.java
Frameworks/base/core/jni/android_util_Binder.cpp
frameworks/native/libs/binder/Parcel.cpp
3.1.1. Parcel.java
- obtain() 获得一个新的parcel对象,相当于java中new一个对象
从parcel池中拿出一个parcel. pool size 为6.取出不为空的parcel后, 将 pool池中的该对象设置为空. 如果池中都为空, 则新建一个parcel对象.
obtain的参数为内存的指针.
- recyle() 清空并回收parcel对象所占内存
清空当前Parcel对象, 回收Parcel占用内存. 同时将该parcel对象重新放入parcel 池中. 调用完该方法后, 不能再使用该对象.
- dataSize() 得到当前parcel对象的实际存储空间
- dataCapacity() 得到当前parcel对象的已分配的存储空间,该值大于或等于dataSize()返回值 。
- dataPostion() 获得当前parcel对象的偏移量(类似于文件流指针的偏移量)
- setDataPosition() 设置偏移量(类似于移动指针到特定位置)
- writeXXX()方法表示写于一个XXX类型的数
- readXXX()方法表示读取一个XXX类型的数
比如:writeInt(int) 写入一个整数;readInt()读取一个整数。