项目:创建书架应用

1. 开始之前

先决条件

  • 能够在 Android Studio 中创建和运行项目。
  • 能够在 Jetpack Compose 中创建布局。
  • 具有使用 Kotlin 中协程的经验。
  • 具有使用 Retrofit、Coil 和 Gson 的经验。

您将构建什么

  • 一个 Android 应用,它向 Web 服务发出多个请求并显示异步下载的图像。

您需要什么

  • 安装了 Android Studio 的电脑。

2. 概览

恭喜您完成第 5 单元!

为了练习您在本单元中学习的概念,包括协程、Retrofit 和 Gson,您将自己构建一个应用,该应用显示来自 Google 图书 API 的书籍列表和图像。

该应用预计执行以下操作

  • 使用 Retrofit 向 Google 图书 API 发出请求。
  • 使用 Gson 解析响应。
  • 以垂直网格的形式异步显示下载的书籍图像及其标题。
  • 通过使用存储库实施最佳实践,分离 UI 和数据层。
  • 使用依赖项注入为需要网络服务的代码编写测试。

此项目的目的是双重的。首先,您可以将本单元中学习的所有概念付诸实践。您还可以使用全新的 REST API,阅读文档,并将您学到的技能应用到新的应用中,就像您作为专业的 Android 开发人员一样。

以下屏幕截图显示了已完成的书架应用示例。应用显示的确切布局和书籍由您决定。您将在以下部分中了解有关如何检索书籍数据的更多信息。

9335665e21b79da1.png

3. 计划您的应用

计划您的 UI

您可以根据自己的喜好设计应用的 UI。您需要考虑应用的布局如何适应不同的设备尺寸。

因为您使用的是图像的滚动网格,所以需要同时加载屏幕上显示的多个图像。获取图像的 URL 后,您可以使用 Coil 库提供的 AsyncImage 可组合项在后台下载数据。在可能的情况下,请务必向用户指示应用何时正在使用网络。

计划网络层

在本单元的 路径 1 中,您学习了如何从网络获取数据并解析 JSON 响应。对于书架应用,数据层需要执行以下三件事

  • 创建一个 Retrofit 服务以从 Google 图书 API 获取数据。
  • 为服务添加获取书籍列表和获取特定书籍信息的方法。
  • 使用 Gson 从 API 返回的 JSON 响应中提取有意义的数据。

让我们简要回顾一下您在本项目中需要的 Google 图书 API 方法。

搜索书籍

Google 图书 API 提供了一种方法,可以根据特定搜索词返回书籍列表,如 使用 API 中所述。

例如,此 URL 返回“爵士乐历史”的搜索结果。

示例

https://www.googleapis.com/books/v1/volumes?q=jazz+history

有几个查询参数可以过滤您的搜索。对于书架应用,q 参数(查询的缩写)就足够了。

文档还显示了预期的 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 图书 API 发出实际请求的伪造服务。
  • 使用伪造服务为存储库编写测试。

需要使用存储库从网络检索书籍数据,以便您可以通过依赖项注入轻松交换数据源。

4. 构建书架应用

现在您已经了解了 Google 图书 API 的概览,是时候构建书架 API 了。即使您使用的是不同的 Web 服务,您也已经学习了完成此项目所需的所有概念。如果需要复习,您可以随时参考本单元以前的代码实验室和示例应用。本单元中的代码实验室可能对您完成项目有所帮助。

我们强烈建议您完成课程中的所有项目。即使您对本单元中学习的所有内容都充满信心,您也可能需要比您想象的更频繁地参考代码实验室。每个人都会遇到这种情况,包括本课程的讲师!因此,享受这个项目,并在进入下一单元之前练习您学到的知识。