【Android 入門開發實戰:口罩地圖】封裝 OkHttp

 

【Android 入門開發實戰:口罩地圖】線上免費講義課程目錄

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

OkHttpUtil

自定義 OkHttpUtil,封裝 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)
    }
}

使用方式

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"

參考資料

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

程式碼範例

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