Activity界面跳转传递数据(将Parcelable实现类写入文件实现界面跳转传递超过1m的数据量)

由于Android中Activity是可以运行在不同的进程中的,所以不能共享内存中的数据,于是有了Intent传递数据(也就是说如果不是不同进程,一个全局变量也可以搞定)。

Intent可以直接存入基本数据类型和可序列化对象。这里主要讲可序列对象。

可序列化对象的接口:Parcelable, Serializable

Serializable是java提供的,使用反射技术实现反序列化,由于反射的实现产生大量临时变量,影响程序性能,所以写代码时我使用了Parcelable接口实现序列化。Parcelable接口也相当简单,将数据按顺序存入,再按顺序取出,所以不会像Serializable接口一样产生大量临时变量。

最近写程序时遇到了麻烦,android界面传递的数据存在缓冲区中,缓冲区大小一般为1m(性能不同可能有所差别),导致传递的数据太多就不能跳转界面或者跳转后反序列化数据时抛出异常(可能部分数据丢失了),于是打算采用跳转前将数据写入内存卡,传递文件名称,跳转界面后再将数据取出。

问题:ObjectOutputStream是java为Serializable接口实现对象封装的,可以直接写入对象到文件中,也可以直接从文件读取出对象,但对于Parcelable接口无能为力,百度了半天都找不到怎么将Parcelable接口对象写入文件,但最终还是找到蛛丝马迹。

Parcel类
用于存储可序列化的对象或数据类型。

跳转界面前存数据到缓存文件:
通过obtain方法取得Parcel池中的对象,写入要存入文件的数据,
调用marshall方法打包数据拿到字节数组,将字节数组写入文件中,
调用recycle返还Parcel对象到池中。

跳转界面后:
根据传递的文件名读取出字节数组,
通过obtain方法取得Parcel池中的对象,
调用unmarshall方法写入数据到Parcel对象中并解包,
调用setDataPosition方法将指针位置移动到数据开头,
调用读取数据的方法按存入时的顺序将序列化对象读取出来,大工告成。

性能确实可以,4m的数据量(集合嵌套集合再嵌套集合的那种)没见卡顿