项目:创建“书架”应用

1. 准备工作

前提条件

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

构建内容

  • 一款可向 Web 服务发出多项请求并显示异步下载的图片的 Android 应用。

所需条件

  • 一台安装了 Android Studio 的电脑。

2. 概览

恭喜您完成第 5 单元!

为了运用您在本单元中学到的概念(包括协程、Retrofit 和 Gson),您将自行构建一款应用,该应用可通过 Google Books API 显示一个包含图片的图书列表。

该应用应能执行以下操作:

  • 使用 Retrofit 向 Google Books API 发出请求。
  • 使用 Gson 解析响应。
  • 在垂直网格中显示异步下载的图书图片以及书名。
  • 采用最佳实践,通过仓库来分隔界面和数据层。
  • 运用依赖项注入为需要网络服务的代码编写测试。

此项目有两个方面的目标。首先,您将实际运用在本单元中学到的所有概念。此外,您还将使用全新的 REST API,阅读相关文档,并将所学技能运用到新应用中,就像专业的 Android 开发者一样。

以下屏幕截图呈现的是已完成的“书架”应用示例。您可以自行决定应用实际显示的布局和图书。请参阅下文,详细了解如何检索图书数据。

9335665e21b79da1.png

3. 规划应用

规划界面

您可以根据需要设计应用的界面。您需要考虑应用布局如何适配不同的设备外形规格。

由于您使用滚动网格布局显示图片,因此需要在屏幕上同时加载多张图片。获取图片的网址后,您可以使用 Coil 库提供的 AsyncImage 可组合项在后台下载数据。当应用使用网络时,请尽可能告知用户。

规划网络层

本单元的在线课程 1 中,您已学习了如何从网络获取数据并解析 JSON 响应。对于“书架”应用,数据层需要执行以下三项操作:

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

下面我们简要介绍一下此项目所需的 Google Books API 方法。

搜索图书

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

例如,以下网址会返回字词“jazz history”的搜索结果。

示例

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

您可以使用多个查询参数来过滤搜索结果。对于“书架”应用,使用 q 参数(查询的简称)就足够了。

《使用 API》一文中还列出了预期的 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"
    },
...

下载图书缩略图

获得缩略图网址后,您可以将其提供给每个网格项中的 AsyncImage 可组合项。

可测试性设计

除了网络概念之外,您还学习了如何重构应用以将仓库类用于数据层。对于此应用,您应该在设计时考虑可测试性,通过依赖项注入功能,使用仓库轻松替换数据源。

  • 为图书服务添加仓库接口。
  • 实现用于访问 Retrofit 服务的仓库类。
  • 实现一项不会实际向 Google Books API 发出请求的虚构服务。
  • 使用该虚构服务,为仓库编写测试。

您需要使用仓库从网络中检索图书数据,以便运用依赖项注入轻松替换数据源。

4. 构建“书架”应用

现在您已经大致了解了 Google Books API,可以开始构建“书架”应用的 API 了。您已经学习了完成此项目所需的所有概念,即使使用其他 Web 服务也能灵活加以运用。如需复习,您可以随时查看本单元中之前的 Codelab 和示例应用。在项目实操中,本单元中的 Codelab 可能会对您有所帮助。

强烈建议您完成本课程中的所有项目。即使您对自己在本单元中所学到的知识很有信心,也请经常回顾这些 Codelab,确保熟练掌握技能。每个人都需要不断复习,即使是本课程的讲师也不例外!因此,在继续学习下一个单元之前,请通过此项目实操充分运用所学知识。