專案:建構書架應用程式

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 取得資料。
  • 新增該服務適用的方法,以便取得書籍清單和特定書籍相關資訊。
  • 使用 Gson,從 API 傳回的 JSON 回應中擷取有意義的資料。

以下將概略介紹這項專案所需的 Google Books API 方法。

搜尋書籍

如「使用 API」一文所述,Google Books API 提供一種方法,可根據特定搜尋字詞傳回書籍清單。

舉例來說,以下網址會傳回「jazz history」字詞的搜尋結果。

範例

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"
    },
...

下載書籍縮圖

取得縮圖網址後,就能將網址提供給格狀版面上每個項目中的 AsyncImage 可組合項。

將可測試性列入設計考量

除了網路相關概念外,您也學到如何重構應用程式,藉此將存放區類別用於資料層。建構這個應用程式時,您應該將可測試性列入設計考量,進而使用依附元件插入功能,透過存放區輕鬆替換資料來源。

  • 加入書籍服務的存放區介面。
  • 實作用於存取 Retrofit 服務的存放區類別。
  • 實作虛構服務,這項服務不會實際向 Google Books API 提出要求。
  • 運用虛構服務,編寫存放區的測試。

您必須使用存放區從網路擷取書籍資料,才能透過依附元件插入功能輕鬆替換資料來源。

4. 建構書架應用程式

現在您已經大致瞭解 Google Books API,可以開始建構書架應用程式了。您已瞭解完成這項專案所需的所有概念,就算使用其他 Web 服務也能靈活應用。如需複習,隨時都能查看本單元中先前的程式碼研究室和範例應用程式。進行專案時,本單元中的程式碼研究室可能會派上用場。

強烈建議您完成課程中的所有專案。即使您對於在本單元中學到的所有知識很有自信,可能還是會需要經常回顧程式碼研究室的說明,次數甚至會超乎您的預期。每個人都會需要不時複習,就算是這門課程的教師也不例外!因此,請在前往下一個單元前,透過這項專案充分練習運用所學知識。