任务三 创建歌曲数据模型
歌曲列表和播放栏的布局已经完成,接下来创建两个数据类:Song 保存一首歌曲的信息,SongResponse 保存接口返回的请求结果和歌曲列表。
一、任务目标
这一步完成后,你将能够:
- 读懂歌曲接口返回的 JSON,找出”请求结果”和”歌曲数据”两层信息。
- 按返回样例创建
Song和SongResponse,属性名称、类型与样例一一对应。 - 对样例中缺失或为空的字段,用可空类型和默认值处理。
二、认识歌曲列表接口
应用通过下面的接口获取歌曲数据。
| 项目 | 内容 |
|---|---|
| 接口名称 | 获取歌曲列表 |
| 作用 | 取得全部歌曲,供应用展示和播放 |
| 请求方式 | GET |
| 接口地址 | https://api.food1.sziit.top/music/list |
| 入参 | 无 |
请求成功时返回的 JSON 如下(资源地址以 … 示意;数组实际有十几首歌曲,这里只完整展示第一首):
{ "data": [ { "id": 1, "name": "唯一", "singer": "邓紫棋", "mvPath": "https://…/weiyi_dengziqi_mv.mp4", "musicPath": "https://…/weiyi_dengziqi.mp3", "imagePath": "https://…/weiyi_dengziqi_cover.jpg", "duration": 253000, "createTime": "2024-09-17 19:29:41", "updateTime": "2026-02-03 15:46:12" }, …… ], "code": 200, "msg": "成功"}请求失败时没有 data,code 不是 200,msg 说明失败原因。例如用 POST 方式请求这个接口:
{ "error": "", "code": 400, "msg": "Request method 'POST' not supported"}返回数据分两层:最外层的 code、msg、data 描述这次请求的结果,data 数组的每个元素描述一首歌曲。这两层分别对应本任务要创建的两个类:歌曲对象对应 Song,最外层包装对应 SongResponse。SongResponse 的列表要用到 Song,所以先创建内层的 Song,再创建外层的 SongResponse。
三、创建 Song 数据类
1. 创建模型目录
在 app/src/main/java/com/sziit/musicplayer 下创建 model 包,再创建 Song.kt。
2. 编写 Song.kt
package com.sziit.musicplayer.model
import java.io.Serializable
data class Song( val id: Int? = null, val name: String = "", val singer: String = "", val mvPath: String? = null, val musicPath: String? = null, val imagePath: String? = null, val duration: Int = 0, val createTime: String? = null, val updateTime: String? = null) : SerializableSong 使用 data class 表示一首歌曲。属性名称与样例中歌曲对象的字段一致,类型和可空性结合应用在界面上的用法确定:
| 字段 | 类型 | 作用 | 可空性说明 |
|---|---|---|---|
id | Int? | 歌曲唯一编号 | 默认 null;播放时按编号查找歌曲,缺少编号时不发起播放 |
name | String | 歌曲名称 | 样例中每首歌曲都有名称,用非空字符串 |
singer | String | 歌手名称 | 样例中每首歌曲都有歌手,用非空字符串 |
mvPath | String? | MV 地址 | 不是每首歌都有 MV,字段可能缺失,也可能是空字符串 |
musicPath | String? | 音频播放地址 | 地址缺失的歌曲无法播放,播放环节会跳过 |
imagePath | String? | 专辑封面地址 | 封面可能缺失,界面有默认封面兜底 |
duration | Int | 歌曲时长,单位毫秒 | 样例为整数毫秒,界面显示时换算为”分:秒”;缺失时按 0 处理 |
createTime、updateTime | String? | 服务端记录的创建和更新时间 | 样例以”年-月-日 时:分:秒”文本返回,界面暂不展示 |
判断一首歌曲有没有 MV 时,需要同时检查字段缺失和空字符串两种情况,可使用 isNullOrEmpty() 判断。Serializable 使歌曲对象能够被序列化,用于在 Android 组件之间传递对象。
四、创建接口响应模型
SongResponse 保存接口返回的整体结果:code 是状态码,msg 是提示信息,data 是歌曲列表。请求失败时,data 可能缺失,因此使用可空类型 List<Song>?;code 的默认值为 -1,表示没有有效的状态码。
1. 创建 SongResponse.kt
在同一个 model 包中创建 SongResponse.kt。
package com.sziit.musicplayer.model
data class SongResponse( val data: List<Song>? = null, val code: Int = -1, val msg: String? = null)属性名称与 JSON 完全一致,任务五引入 Gson 后,按名称就能把整段 JSON 自动转换成 SongResponse 对象;任务五还会用 code == 200 判断请求是否成功。
五、编译验证
模型属于数据层,本任务不改变界面。执行菜单 Build > Make Module ‘app’,输出区没有编译错误,本任务即完成。
任务小结
Song 保存单首歌曲的信息,SongResponse 保存请求结果和歌曲列表。属性名称与 JSON 字段对应,可空类型和默认值用于处理缺失数据。列表显示和网络解析将使用这两个数据类。