Android 效能優化系列 — 21 網路請求的效能優化

Evan Chen
5 min readOct 12, 2022

--

Photo by Marianna Lutkova on Unsplash

App 在要跟後端 API 請求資料的等待時間過久,對使用者來說是很有感的,這篇將介紹如何優化網路請求的效能。

使用成熟的 Open Source 函式庫

在與後端 API 請求資料時,不要自已用較底層的HttpURLConnection。直接使用專門處理 API 的 Open source 函式庫,例如 Retrofit 或是 Apollo,能加快網路請求速度。

Retrofit 實作 API Request

我們就來介紹 Retrofit 這個套件用來跟後端 API 取得料。

首先加入 dependencies

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:okhttp:4.9.3'
implementation 'com.squareup.okhttp3:logging-interceptor:4.0.1'

這個範例我們想透過這個 API 網址來取得資料,而回傳的資料如下。

網址:https://jsonplaceholder.typicode.com/todos/1

回傳 Json:

{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}

首先針對每一個 Request 建立 interface。

interface ApiService {
@GET("todos/{id}")
fun getTodo(@Path("id") id: Int): Call<TodosResponse>
}

建立回傳 Json 的資料模型。

data class TodosResponse(
val userId: Int,
val id: Int,
val title: String,
val completed: Boolean
)

新增類別 AppClientManager,在這裡實作 Retrofit 的連線功能。

class AppClientManager private constructor() {
private val retrofit: Retrofit
init {
val okHttpClient = OkHttpClient().newBuilder()
.build()
retrofit = Retrofit.Builder()
.baseUrl(Config.URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build()
}
companion object {
private val manager = AppClientManager()
val client: Retrofit
get() = manager.retrofit
}
}

接著透過 AppClientManager 去呼叫 getTodo(1) 就可以取得回傳的 TodosResponse 了。

private fun callAPI() {
val apiService = AppClientManager.client.create(ApiService::class.java)
apiService.getTodo(1).enqueue(object : Callback<TodosResponse> {
override fun onResponse(call: Call<TodosResponse>, response: Response<TodosResponse>) {
println("response:$response")
}
override fun onFailure(call: Call<TodosResponse>, t: Throwable) {
println("onFailure:$t")
}
})
}

這樣就完成了透過 Retrofit 請求 API 資源,使用上非常方便,效能也會比自已使用HttpURLConnection來得好。

在 App 建立 Cache

如果網路請求的時間仍是過長,在 App 建立 Cache 也是提升效能的方式,尤其是網路圖片的載入,直接使用像 Glide 這種載入圖片的函式庫,載入速度快且支援 Cache 功能。

從後端伺服器建立 Cache

網路請求的效能問題不見得是 App 的問題,一個網路的請求有可能是慢在後端的資料庫查詢,所以後端 API 如果有 Cache 對於效能也能有所提升。我們在後續會有一篇介紹在處理效能優化處理,你應該懂得尋求協助,不管是向後端或是設計尋求協助,因為效能不只是 App 開發人員的事。

下一篇:使用 Network Inspector 檢查網路流量

--

--