`

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化都可以

 

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

分享到:
评论
1 楼 fyc0109 2013-11-22  
为什么我传过去的值, 有的都不对呢, 顺序也是一样的.就是获得的值 前面完全没有.

相关推荐

    Activity 间intent传递有序排序的map集合

    在Intent中,我们通常使用Serializable或Parcelable接口来序列化对象以便传递。因为HashMap不保证顺序,所以如果需要在Intent中传递一个有序的Map,我们应选择实现LinkedHashMap。 `LinkedHashMap`的特性: 1. 保持...

    ParcelableDemo.rar

    在Android开发中,数据序列化是一个非常重要的概念,它允许对象的状态被保存和恢复,以便在不同的时间点或不同的进程间传递。`Parcelable`是Android系统提供的一种高效的数据序列化方式,比Java自带的`Serializable`...

    Activity之间传递对象的Demo

    Android提供了Parcelable接口,用于序列化和反序列化对象,使其可以在Intent中传递。为了让自定义对象能够通过Intent传递,我们需要让该类实现Parcelable接口。实现这个接口需要编写以下方法: 1. `public int ...

    Parcelable

    在Android开发中,Parcelable接口是Android系统提供的一种高效的数据序列化方式,主要用于在进程间或者内存中传递数据。相比Serializable接口,Parcelable提供了更高的性能,但同时也需要更多的编码工作。本篇将详细...

    Parcelable in Android

    除了基本类型的序列化,Parcelable还可以处理更复杂的对象,包括数组、集合和自定义对象。对于这些情况,需要在`writeToParcel()`和`createFromParcel()`方法中分别处理。 总结来说,Android的Parcelable接口为...

    Activity之间传递List数据

    Parcelable是Android系统提供的一个高效的数据序列化接口,它比Serializable更快,但实现起来稍复杂。如果List中的T是自定义类,需要实现Parcelable接口。以下是一个简单的示例: ```java public class MyData ...

    Android Intent传递对象

    要使自定义对象能够通过Intent传递,首先在类定义上添加`implements Serializable`。然后,所有非静态和非transient的成员变量也会被序列化。例如: ```java public class CustomObject implements Serializable...

    Fragment 与 Activity之间传递数据

    Bundle类似于一个键值对的集合,可以存储各种基本类型的数据,甚至是复杂的对象(通过序列化或Parcelable接口)。以下是一个简单的使用示例: ```java // 在Activity中创建Fragment并设置数据 Fragment fragment = ...

    Android通过Intent传递数据

    对于自定义对象,它们必须实现`Parcelable`接口,以便能够通过Intent进行序列化和反序列化。 4. **使用Bundle**: 如果数据量较大,可以使用`Bundle`对象,将之作为Intent的一个额外参数。`Bundle`提供了丰富的put...

    安卓Android源码——Bundle.rar

    Bundle类是Android SDK中的一个类,它继承自Parcelable接口,主要用来在Activity之间传递数据。由于Android不支持对象的直接传递,Bundle提供了将数据序列化的方式,使得复杂的数据结构能够在不同组件之间安全地传输...

    Android中Parcelable的作用实例解析

    在Android开发中,Parcelable接口是用于对象序列化和反序列化的机制,相比于Java自带的Serializable接口,它在性能上有着显著的优势。当需要通过Intent在不同的Activity之间传递复杂对象,或者进行进程间通信(IPC)...

    android activityIntent 传值 传对象

    - **Parcelable**:Parcelable是Android系统提供的一种高效的序列化方式。首先,让自定义类实现Parcelable接口,重写writeToParcel()和describeContents()方法。然后在Intent中使用putParcelableArrayListExtra()或...

    利用Parceable传递复杂对象

    Android系统提供了一种高效的数据序列化机制——Parceable接口,使得我们可以将对象转换为原始字节流,进而可以在Intent中传递或者保存到内存或文件系统。下面我们将详细讨论如何利用Parceable来传递复杂对象,如...

    intent传递ArrayList&lt;T&gt;

    通过实现序列化和反序列化,我们可以安全地在组件间传递复杂的对象集合。这不仅适用于ArrayList,也适用于其他实现了Parcelable接口的集合类,如LinkedList、HashSet等。熟悉这些机制对于优化应用性能和提升用户体验...

    android页面跳转传值

    Android中的Parcelable接口是高效的数据序列化方式,适用于需要跨进程传递或者存储在Intent中。实现Parcelable接口的类需要重写`writeToParcel()`和`describeContents()`方法。虽然比Serializable接口更高效,但...

    android bundle message

    对于复杂对象,如自定义类实例,需要该类实现Parcelable接口,以便进行序列化和反序列化。 3. 传递数据:在Activity之间传递数据时,我们通常在`Intent`对象中使用`putExtras(Bundle)`方法将Bundle附加到Intent。...

    Android学习笔记之bundle用法源码

    在Android开发中,Bundle是一个非常重要的工具类,用于在组件之间传递数据。它与Intent紧密关联,是Android应用中数据交换的重要桥梁。本篇学习笔记将深入探讨Bundle的使用方法和源码分析,帮助开发者更好地理解和...

    Intent——把两个Activity关联起来!

    Parcelable接口允许更高效的序列化,适合传递复杂对象,如自定义Model类。 7. Intent Extras:Intent还提供了额外的功能,如`putExtra()`的变种方法,支持数组、集合、Parcelable对象等复杂数据类型。此外,还可以...

    【Intent传递】对象、数组

    在Android应用开发中,Intent是连接各个组件(如Activity、Service、BroadcastReceiver)的重要桥梁,用于传递数据和启动意图。本DEMO主要讲解如何通过Intent传递对象和数组,这些都是Android开发中的基础知识,对于...

Global site tag (gtag.js) - Google Analytics