当前位置: 代码迷 >> Android >> Android Parcelable序列化自定义种集合在Activity间传递
  详细解决方案

Android Parcelable序列化自定义种集合在Activity间传递

热度:94   发布时间:2016-05-01 10:46:27.0
Android Parcelable序列化自定义类集合在Activity间传递

来自http://zartzwj.iteye.com/blog/1136891

我们会考虑创建一些复杂(包含的数据类型有多种)的Model,方便在数据上的传输和处理。一些关于android中对于这类model的传递,一般都是实现Parcelable或者是Serializable这两个接口,这两个接口有一些不同,Serializable接口一般只做一些简单的数据类型传递,而Parcelable可以实现很多复杂的情况,比如Parcelable中嵌套了图片,要把图片toByte[]变成字节数组,这里没有做,重点是实现了Parcelable的其他模型等,而对于这种复杂的类型,网上很难找到这样的内容,所以我做了一个例子来解决。

?

?? ? ?首先,我创建了三个数据model:ArtistMode,TrackModel和AlbumModel,根据名字大家应该能够明白。这三个类中只有ArtistModel是实现的Serializable接口,另外两个都是实现的Parcelable接口。

?? ? ?ArtistModel:歌手信息,包含了歌手的名字,年龄,性别和国籍,这些都是简单的String和int型数据;

?? ? ?TrackMode:歌曲信息,包含歌曲的名字,发行时间和歌手列表(这里采用了一个存放ArtistMode的List);

?? ? ?AlbumModel:专辑信息,包含了专辑的名字,歌手信息(ArtistMode),发行时间和歌曲列表(一个存放TrackModel的List)。

?

介绍完了三个模型后,我们就要具体实现模型中数据的读写了。对于Parcelable或者是Serializable该复写哪些方法我也就不多说,网上对于这个介绍的都很多。现在是说说一个需要注意的地方。

1、实现Parcelable接口。
2、并且实现Parcelable接口的public
?void writeToParcel(Parcel dest, int flags)方法 。
3、自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Creator接口及其方法。
简而言之:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致。

?

?

Java代码??收藏代码
  1. @Override??
  2. ????public?void?writeToParcel(Parcel?dest,?int?flag)?{??
  3. ????????dest.writeString(albumName);??
  4. ????????dest.writeSerializable(artistModel);??
  5. ????????dest.writeList(trackList);??
  6. ????????dest.writeString(releaseTime);??
  7. ????}??
  8. ??
  9. ????public?static?final?Parcelable.Creator<AlbumModel>?CREATOR?=?new?Parcelable.Creator<AlbumModel>()?{??
  10. ??
  11. ????????@Override??
  12. ????????public?AlbumModel?createFromParcel(Parcel?source)?{??
  13. ??
  14. ????????????AlbumModel?model?=?new?AlbumModel();??
  15. ????????????model.albumName?=?source.readString();??
  16. ????????????model.artistModel?=?(ArtistModel)?source.readSerializable();??
  17. ????????????//?必须实例化??
  18. ????????????model.trackList?=?new?ArrayList<TrackModel>();??
  19. ????????????source.readList(model.trackList,?getClass().getClassLoader());??
  20. ??
  21. ????????????model.releaseTime?=?source.readString();??
  22. ????????????return?model;??
  23. ????????}??
  24. ??
  25. ????????@Override??
  26. ????????public?AlbumModel[]?newArray(int?size)?{??
  27. ????????????return?new?AlbumModel[size];??
  28. ????????}??
  29. ????};??

?注意上面在writeToParcel()方法中我用了一个dest.writeList(trackList);来传递一个List。相对应的读取里面,有这段代码:

?

Java代码??收藏代码
  1. //?必须实例化??
  2. ????????????model.trackList?=?new?ArrayList<TrackModel>();??
  3. ????????????source.readList(model.trackList,?getClass().getClassLoader());??

?

?这里要想读出存放进去的List,就必须先将List实例化,否则就读不出来数据,getClass().getClassLoader()可以TrackModel.class.getClassLoader()这是我在查看Android的源码后发型的,对于数据的读写,系统提供了一个比较全的读取方法是readValue,这个方法中,系统会自动进行数据匹配的,但是具体的使用,大家可以去尝试,只要明白读写的方式后,就不难实现了。

写:

dest.writeValue(artistModel);

?读:

mode.artistModel=(TrackMode)source.readValue(TrackMode.class.getClassLoader());

可以是Serializable化,或者Parcelable化都可以

?

上面是一个唯一需要特别注意的地方。其余的数据类型该怎么传递,大家可以尝试,接下来我会把整个项目上传,大家有什么问题可以留言。

  相关解决方案