很久没有写了,一直不知道写什么,最近在研究怎样在Android的开发中传递一些复杂的数据。其实网上已经有很多的人都写过相关的,但是看了后,发现都大同小异,缺少我想要看到的地方。所以我打算做一下这方面的探讨。
有时候在团队开发的时候,我们会考虑创建一些复杂(包含的数据类型有多种)的Model,方便在数据上的传输和处理。一些关于android中对于这类model的传递,一般都是实现Parcelable或者是Serializable这两个接口,这两个接口有一些不同,Serializable接口一般只做一些简单的数据类型传递,而Parcelable可以实现很多复杂的情况,比如Parcelable中嵌套了图片,实现了Parcelable的其他模型等,而对于这种复杂的类型,网上很难找到这样的内容,所以我做了一个例子来解决。
首先,我创建了三个数据model:ArtistMode,TrackModel和AlbumModel,根据名字大家应该能够明白。这三个类中只有ArtistModel是实现的Serializable接口,另外两个都是实现的Parcelable接口。
ArtistModel:歌手信息,包含了歌手的名字,年龄,性别和国籍,这些都是简单的String和int型数据;
TrackMode:歌曲信息,包含歌曲的名字,发行时间和歌手列表(这里采用了一个存放ArtistMode的List);
AlbumModel:专辑信息,包含了专辑的名字,歌手信息(ArtistMode),发行时间和歌曲列表(一个存放TrackModel的List)。
介绍完了三个模型后,我们就要具体实现模型中数据的读写了。对于Parcelable或者是Serializable该复写哪些方法我也就不多说,网上对于这个介绍的都很多。现在是说说一个需要注意的地方。
Java代码
@Override
public void writeToParcel(Parcel dest, int flag) {
dest.writeString(albumName);
dest.writeSerializable(artistModel);
dest.writeList(trackList);
dest.writeString(releaseTime);
}
public static final Parcelable.Creator<AlbumModel> CREATOR = new Parcelable.Creator<AlbumModel>() {
@Override
public AlbumModel createFromParcel(Parcel source) {
AlbumModel model = new AlbumModel();
model.albumName = source.readString();
model.artistModel = (ArtistModel) source.readSerializable();
// 必须实例化
model.trackList = new ArrayList<TrackModel>();
source.readList(model.trackList, getClass().getClassLoader());
model.releaseTime = source.readString();
return model;
}
@Override
public AlbumModel[] newArray(int size) {
return new AlbumModel[size];
}
};
@Override
public void writeToParcel(Parcel dest, int flag) {
dest.writeString(albumName);
dest.writeSerializable(artistModel);
dest.writeList(trackList);
dest.writeString(releaseTime);
}
public static final Parcelable.Creator<AlbumModel> CREATOR = new Parcelable.Creator<AlbumModel>() {
@Override
public AlbumModel createFromParcel(Parcel source) {
AlbumModel model = new AlbumModel();
model.albumName = source.readString();
model.artistModel = (ArtistModel) source.readSerializable();
// 必须实例化
model.trackList = new ArrayList<TrackModel>();
source.readList(model.trackList, getClass().getClassLoader());
model.releaseTime = source.readString();
return model;
}
@Override
public AlbumModel[] newArray(int size) {
return new AlbumModel[size];
}
}; 注意上面在writeToParcel()方法中我用了一个dest.writeList(trackList);来传递一个List。相对应的读取里面,有这段代码:
Java代码
// 必须实例化
model.trackList = new ArrayList<TrackModel>();
source.readList(model.trackList, getClass().getClassLoader());
// 必须实例化
model.trackList = new ArrayList<TrackModel>();
source.readList(model.trackList, getClass().getClassLoader());
这里要想读出存放进去的List,就必须先将List实例化,否则就读不出来数据。这是我在查看Android的源码后发型的,对于数据的读写,系统提供了一个比较全的读取方法是readValue,这个方法中,系统会自动进行数据匹配的,但是具体的使用,大家可以去尝试,只要明白读写的方式后,就不难实现了。
上面是一个唯一需要特别注意的地方。其余的数据类型该怎么传递,大家可以尝试,接下来我会把整个项目上传,大家有什么问题可以留言。
分享到:
相关推荐
在Android应用开发中,Activity是用户界面的基本单元,它们之间的数据传递是十分常见的操作。本文将详细介绍Android中Activity之间数据传递的多种方式及其适用场景。 一、Intent传递数据 Intent是Android系统中...
在Android应用开发中,与服务器进行数据交互是一个关键环节,特别是当涉及到对象的传递时。本文将探讨如何在Android中调用WebService并使用JSON来安全地传输实体对象。首先,我们依赖于两个类库:ksoap2-android-...
在标题“aidl传递复杂数据”中,我们讨论的是如何通过AIDL传输不仅仅是基本类型,还包括更复杂的对象,如ORMLite管理的数据库模型。 ORMLite(Object-Relational Mapping Lite)是一个轻量级的ORM库,用于简化...
总的来说,Android React-Native的通信数据模型是一个复杂但高效的系统,它通过JNI在Java和C++之间建立桥梁,利用Json和自定义的`NativeArray`类处理数据的序列化和反序列化。为了优化性能和避免数据同步问题,...
8. **Parcelable与Serializable**: 如果你的数据模型需要在Adapter之间传递,考虑实现Parcelable接口,因为它的序列化性能优于Serializable。 9. **性能优化**: 在处理大量数据时,注意ListView的优化,如使用...
在使用Android Data Binding库时,控件标签可以作为绑定表达式的一部分,帮助将数据模型与视图组件关联起来: ```xml android:layout_width="wrap_content" android:layout_height="wrap_content" android:text...
在这个模型中,客户端(Client)与服务器端(Server)进行交互,使得用户能够通过互联网进行即时消息传递。下面我们将深入探讨CS聊天模型的关键组成部分、工作原理以及实现细节。 1. **架构概述** CS聊天模型基于...
`Parcelable`是Android提供的一种高效的数据序列化方式,相比`Serializable`,它的序列化和反序列化速度更快,但实现过程相对复杂。 标题"Android Parcelable序列化自定义类集合在Activity间传递"所涉及的知识点...
事件传递机制遵循“父子组件”模型,可以分为三个主要阶段:捕获阶段、目标阶段和消耗阶段。 1. 捕获阶段:事件首先由根布局(通常是ViewGroup)接收,然后自顶向下逐级传递。在这一阶段,每个ViewGroup都有机会...
在Android应用开发中,由于UI操作必须在主线程(UI线程)中执行,因此需要遵循单线程模型,避免阻塞主线程,确保应用的流畅性。当需要执行耗时操作,如网络请求、数据处理等,需要在子线程中进行。Android为此提供了...
4. **Serializable**: Serializable是Java提供的通用序列化接口,适用于简单数据模型的传递。虽然实现简单,只需在类上添加Serializable接口,但序列化和反序列化过程相对较慢,占用资源较多,不推荐用于频繁的数据...
在Android开发中,DataBinding库是Google推荐的一种用于简化视图和数据模型之间绑定的技术,它使得MVVM(Model-View-ViewModel)架构模式在Android应用中的实现更加便捷。本篇文章将深入探讨DataBinding的工作原理、...
然而,对于简单的数据模型或者不需要考虑性能的情况下,`Serializable`接口是一个更简单的选择。 总结起来,Android中的Intent对象传递主要有`Serializable`和`Parcelable`两种方式,其中`Parcelable`性能更优,但...
BaseAdapter适合处理各种复杂的数据模型和自定义视图,具有高度的灵活性和可扩展性,但相应的,编程难度也会增加。 在实际项目中,选择哪种适配器主要取决于需求的复杂度。如果只需要展示简单的字符串列表,...
3. **模型推理**:使用 TensorFlow Lite Interpreter 推理库加载模型,并传递预处理后的音频数据进行预测。Interpreter 提供了接口用于执行模型并获取输出。 4. **结果解析**:将模型的输出转换为可读的中文文本,...
本文介绍了一种结合了细粒度权限配置与动态隐私数据着色隔离技术的新型Android隐私保护模型,旨在全方位地保护Android用户的隐私数据。 #### 细粒度权限配置机制 传统的Android权限机制采用静态且较为粗放的方式,...
2. Files:通过文件流操作,开发者可以直接读写文件,适用于处理较大或复杂的结构化数据。这种方式需要开发者自行管理文件的创建、删除和访问权限。 3. SQLite:这是Android内置的关系型数据库,支持SQL语言,适合...
使用DataBinding,你可以将数据模型直接传递给布局,使得数据和视图之间的关系更加清晰。 **ViewStub的基本概念** ViewStub是一个特殊的轻量级视图,它的初始状态是不可见的,不占用任何空间,也不会参与测量、布局...