1. 开始之前
前提条件
- 能够在 Android Studio 中创建并运行项目。
- 能够在 Jetpack Compose 中创建布局。
- 拥有在 Kotlin 中使用协程的经验。
- 拥有使用 Retrofit、Coil 和 Gson 的经验。
您将构建什么
- 一款 Android 应用,可向网络服务发出多个请求并显示异步下载的图片。
您需要什么
- 一台安装了 Android Studio 的计算机。
2. 概述
恭喜您完成了第 5 单元!
为了练习您在本单元中学习到的概念,包括协程、Retrofit 和 Gson,您将自行构建一个应用,用于显示来自 Google Books API 的图书列表及其图片。
此应用应执行以下操作
- 使用 Retrofit 向 Google Books API 发出请求。
- 使用 Gson 解析响应。
- 在垂直网格中显示异步下载的图书图片及其标题。
- 通过使用仓库实现最佳实践,分离 UI 层和数据层。
- 使用依赖注入为需要网络服务的代码编写测试。
此项目的目标有两个。首先,您可以将本单元学习到的所有概念付诸实践。您还将接触全新的 REST API、阅读文档,并将所学技能应用于新应用中,就像专业的 Android 开发者一样。
以下屏幕截图显示了已完成的图书架应用的示例。应用的具体布局和显示的图书取决于您。您将在以下部分中了解如何检索图书数据。
3. 规划您的应用
规划您的 UI
您可以随意设计应用的 UI。您需要考虑应用的布局如何适应不同的设备尺寸。
由于您使用的是图片滚动网格,因此需要在屏幕上同时加载多张图片。获取图片的 URL 后,您可以使用 Coil 库提供的 AsyncImage
可组合项在后台下载数据。在可能的情况下,务必在应用使用网络时告知用户。
规划网络层
在本单元的第 1 路径中,您学习了如何从网络获取数据以及解析 JSON 响应。对于图书架应用,数据层需要执行以下三件事
- 创建 Retrofit 服务以从 Google Books API 获取数据。
- 为该服务添加获取图书列表和获取特定图书信息的方法。
- 使用 Gson 从 API 返回的 JSON 响应中提取有意义的数据。
我们简要介绍一下此项目需要的 Google Books API 方法。
搜索图书
Google Books API 提供了一种方法,可以根据特定搜索词返回图书列表,详情请参阅使用 API。
例如,此 URL 返回搜索词“爵士乐史”的搜索结果。
示例
https://www.googleapis.com/books/v1/volumes?q=jazz+history
有几个查询参数可以过滤您的搜索。对于图书架应用,q
参数(query 的缩写)就足够了。
文档中还显示了预期的 JSON 响应。对于图书架应用,您需要提取图书的 id
。
请求特定图书的信息
您需要发出请求以获取特定图书的信息。此端点接受您从上一个响应中提取的 id。
https://www.googleapis.com/books/v1/volumes/<volume_id>
您可以在 volumeInfo
对象中的 imageLinks
对象中找到缩略图链接。对于此应用,您要下载的图片位于 thumbnail
键下。
...
"imageLinks": {
"smallThumbnail": "http://books.google.com/books/publisher/content?id=EPUTEAAAQBAJ&printsec=frontcover&img=1&zoom=5&edge=curl&imgtk=AFLRE734s3CngIs16gM_Ht6GeGF4ew664I7oOGghmfk4pgfFcDYb4GlYCYdjtqqXluL2KUyfq_Ni5MSyv4JxEJ8W679zQ2Ib3okUKau3I1ruqBGrWOt2_haUauWC8sXEgjN7JHm4uOjS&source=gbs_api",
"thumbnail": "http://books.google.com/books/publisher/content?id=EPUTEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&imgtk=AFLRE71N0ldzv6rliUV_K5ZACa9yPNcT8Ino6YKXJUMje_z4GsC9cp6gFql5TxlmqMoYN3CDhM3XAIO2riFeMXUnFVr5pTLq91htTtG1DDyvOdiR4yI6xu3yEEAn0dRbvNFZ5m7dUC9E&source=gbs_api",
"small": "http://books.google.com/books/publisher/content?id=EPUTEAAAQBAJ&printsec=frontcover&img=1&zoom=2&edge=curl&imgtk=AFLRE71HmTwpoe3KR0AISYk5sDgV2Fz-F-6CDKJtFdvlXSZv3jEzFtsSXGJnEGjtCuoDMxP_6sgP8au1yadB7OmI2MhIBquel7ivcDB8e9ieLyh4HNoXnX3zmxfF_CfIfnNXDv0WHuyA&source=gbs_api",
"medium": "http://books.google.com/books/publisher/content?id=EPUTEAAAQBAJ&printsec=frontcover&img=1&zoom=3&edge=curl&imgtk=AFLRE72LMPH7Q2S49aPeQ3Gm8jLEf6zH4ijuE0nvbOyXBUAgyL816pXzaw0136Pk8jXpfYYFY0IsqL7G7MMDMgKcJhnaoHojWNZpljZmGHeWLL_M7hxkOpmdmO7xza8dfVfPbFmBH4kl&source=gbs_api",
"large": "http://books.google.com/books/publisher/content?id=EPUTEAAAQBAJ&printsec=frontcover&img=1&zoom=4&edge=curl&imgtk=AFLRE71w0J9EOzUzu1O5GMbwhnpI8BLWzOEtzqc9IfyxEDqimZ--H4JlNAZh_1zx8pqPNRf1qDt7FPb57lH5ip-LBlK3zjMC-MCBYcciuoPjTJOFmLv7pp5B6_-UFBap1KRfC0eG7P4d&source=gbs_api",
"extraLarge": "http://books.google.com/books/publisher/content?id=EPUTEAAAQBAJ&printsec=frontcover&img=1&zoom=6&edge=curl&imgtk=AFLRE73t0gcxT-jzEETp8Yo5Osr15nVL7ntKL2WSe2S8kRSio7w0CGgErAq4WbPWIsH4TmOdP_EO6ZoPNSP-YGSOwqfPMw8_IlYE6hy9IKeAs5V_xaHy7drZleF0eizAQiEVg5ci7qby&source=gbs_api"
},
...
下载图书缩略图
获取缩略图 URL 后,可以将其提供给每个网格项中的 AsyncImage
可组合项。
设计以便测试
除了网络概念之外,您还学习了如何重构应用以使用仓库类处理数据层。对于此应用,您应该在设计时考虑到可测试性,使用仓库通过依赖注入轻松切换数据源。
- 为图书服务包含一个仓库接口。
- 实现一个访问 Retrofit 服务的仓库类。
- 实现一个不向 Google Books API 发出实际请求的伪造服务。
- 使用伪造服务为仓库编写测试。
图书数据需要使用仓库从网络检索,从而允许您通过依赖注入轻松切换数据源。
4. 构建图书架应用
既然您对 Google Books API 有了概述,接下来就是构建图书架 API 了。尽管您使用的是不同的网络服务,但您已经学习了完成此项目所需的所有概念。如果您需要复习,可以随时参考本单元之前的 Codelabs 和示例应用。本单元中的 Codelabs 可能对您进行项目有帮助。
我们强烈建议您完成课程中的所有项目。即使您对本单元学习的所有内容都充满信心,您很可能需要比您想象的更频繁地参考 Codelabs。这种情况发生在每个人身上,甚至包括本课程的讲师!因此,请享受这个项目带来的乐趣,并在进入下一单元之前练习您所学到的知识。