【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
授權範圍:使用時必須註明出處且不得為商業目的之使用
範例下載點:點我下載