iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0

本篇文章同步發表在 HKT 線上教室 部落格,線上影音教學課程已上架至 UdemyYoutube 頻道。另外,想追蹤更多相關技術資訊,歡迎到 臉書粉絲專頁 按讚追蹤喔~

程式碼範例

範例名稱:獲取口罩資料,改使用封裝過的 OkHttp
開發人員:HKT (侯光燦)
程式語言:Kotlin
開發環境:Android Studio 4.1.1 & Android 11 & Kotlin 1.4.21
授權範圍:使用時必須註明出處且不得為商業目的之使用
範例下載點:點我下載

今天 KT 簡單封裝了 OkHttp。使用單例模式 (Singleton),確保 OkHttpClient 只有一個實例存在,減少連線反應延遲與降低記憶體空間,改善提高整體運行效能。這次只簡單封裝 get 功能,若未來還需要更多 OkHttp 相關功能,如:需要 post 或是上傳檔案、下載進度狀態...等,可以再進行功能擴充。

而 Koltin 宣告成單例的方式,因為 Koltin 沒有 static 修飾詞,所以需採用 「Companion Object」 關鍵字來修飾,如此即可以達到靜態的宣告方式,來確保這個類別只會存在一個實體的物件。另外在透過 lazy 加載方式,並將模式設定為 「LazyThreadSafetyMode.SYNCHRONIZED」 ,鎖定只讓一條執行緒 (thread) 可以去初始化 lazy 屬性。所以在多執行緒的情況下,一但沒有初始化完成,其他執行緒將無法訪問使用。

OkHttpUtil

自定義 OkHttpUtil,封裝 OkHttp,簡化原本繁雜步驟的程式碼,之後呼叫變得很簡單俐落。不用每次只要使用到 OkHttp 都要寫一大堆程式碼。造成日後開發或維護上的麻煩。

import okhttp3.*
import okio.IOException


class OkHttpUtil {
    private var mOkHttpClient: OkHttpClient? = null

    companion object {
        val mOkHttpUtil: OkHttpUtil by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
            OkHttpUtil()
        }
    }

    init {
        //Part 1: 宣告 OkHttpClient
        mOkHttpClient = OkHttpClient().newBuilder().build()
    }

    //Get 非同步
    fun getAsync(url: String, callback: ICallback) {
        //Part 2: 宣告 Request,要求要連到指定網址
        val request = with(Request.Builder()) {
            url(url)
            get()
            build()
        }

        //Part 3: 宣告 Call
        val call = mOkHttpClient?.newCall(request)

        //執行 Call 連線後,採用 enqueue 非同步方式,獲取到回應的結果資料
        call?.enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                callback.onFailure(e)
            }

            @Throws(IOException::class)
            override fun onResponse(call: Call, response: Response) {
                callback.onResponse(response)
            }
        })


    }


    interface ICallback {
        fun onResponse(response: Response)

        fun onFailure(e: IOException)
    }
}

使用方式

改成這樣去使用 OkHttp,是不是變得比較相當親民呢?

//定義要連線的網址
val your_url_name = "your_url"
   

mOkHttpUtil.getAsync(your_url_name, object : OkHttpUtil.ICallback {
    override fun onResponse(response: Response) {
      //收到回應資料邏輯區塊

    }

    override fun onFailure(e: okio.IOException) {
      //發生連線錯誤邏輯區塊

    }
})

Constants 常數檔案

未來會有很多常數固定資料,為了更好管理與維護,我們習慣會將常數資料,特別獨立出去放到如: Constants.kt。以這次口罩資料網址為例,我們就可以將它整理歸納寫到這個檔案裡。而固定常數的命名風格,習慣全大寫,單字與單字之間透過底線
區隔,如:PHARMACIES_DATA_URL。

package com.thishkt.pharmacydemo

const val PHARMACIES_DATA_URL="https://raw.githubusercontent.com/thishkt/pharmacies/master/data/info.json"

參考資料

HKT 線上教室
https://tw-hkt.blogspot.com/

Freepik
https://www.freepik.com/

OkHttpClients Should Be Shared
https://square.github.io/okhttp/4.x/okhttp/okhttp3/-ok-http-client/#okhttpclients-should-be-shared


後記,今天鐵人挑戰賽第十二天,遇到璨樹中度颱風( CHANTHU ) 侵襲,願大家一切都平安。趁現在還沒停電,趕緊發文。

那今天【iThome 鐵人賽】就介紹到這邊囉~

順帶一提,KT 線上教室,臉書粉絲團,會不定期發佈相關資訊,不想錯過最新資訊,不要忘記來按讚,追蹤喔!也歡迎大家將這篇文章分享給更多人喔。

我們明天再見囉!!!掰掰~


上一篇
Day 11:ProgressBar 忙碌圈圈
下一篇
Day 13:RecyclerView 基本資料列表顯示
系列文
Android 口罩地圖入門實戰 30 天 (使用 Kotlin 程式語言)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言