iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0

為了今天要用 async 執行非同步取得咖啡廳資料,所以昨天先做了簡單的實驗,現在直接來改寫程式碼吧~~

改寫 - 使用 async 取得 API 資料

binding.button.setOnClickListener {

    // 這個 Scope 即是在 Android Main Thread 上啟動 coroutine
    lifecycleScope.launch(Dispatchers.Main) {
        try {

            binding.progressbar.visibility = View.VISIBLE

            // 等待非同步執行結果
            val deferredResult = fetchCoffeeShopDataByAsync().await()

            // 更新畫面
            binding.textView.text = deferredResult
            binding.progressbar.visibility = View.GONE
        }
        catch (e: CoffeeShopsRefreshError) {

            binding.textView.text = "Request failed \nmessage: ${e.message}"
            binding.progressbar.visibility = View.GONE
        }
    }
}

接著來看看使用 async 在 IO 執行緒上啟動 coroutine 執行非同步任務 fetchCoffeeShopDataByAsync() :

private fun fetchCoffeeShopDataByAsync(): Deferred<String?> {

    return lifecycleScope.async(Dispatchers.IO) {

        // 創建一個 OkHttpClient 實例
        val client = OkHttpClient()

        // 設置要發送的 HTTP 請求
        val request = Request.Builder()
            .url("http://cafenomad.tw/api/v1.2/cafes/taipei")
            .build()

        val response = try {

            // 使用 OkHttpClient 發送同步請求
            client.newCall(request).execute()
        }
        catch (cause: IOException) {

            throw CoffeeShopsRefreshError("Unable to refresh data", cause)
        }

        if (!response.isSuccessful) {

            throw CoffeeShopsRefreshError("Unable to refresh data", null)
        }
        return@async response.body?.string()
    }
}

重點只有兩點 :

  • 使用 lifecycleScope.async(Dispatchers.IO) {} : 在 IO 執行緒上啟動 coroutine
  • response 成功接出來後,回傳 return@async response.body?.string()

return@async 是用來指定要返回的值,因為目前還沒把 Json 字串接出來,就簡單地返回字串就好。

終於成功拉~~~

好好讀完後再寫就沒有感到很難,學習果然不能囫圇吞棗阿哈哈

d13_1.png

今日推推

聽友人說這首歌是抖音神曲,但那又如何,自己喜歡才是最重要的
Yes


上一篇
Day12 使用 Async 啟動 Coroutine 取得網路請求 (上)
下一篇
Day14 重構 | 使用 MVP 作為 Kotlin App 的設計架構
系列文
喝咖啡要30天?一起用 Kotlin 打造尋找好喝咖啡的 App30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言