本篇文章同步發表在 HKT 線上教室 部落格,線上影音教學課程已上架至 Udemy 和 Youtube 頻道。另外,想追蹤更多相關技術資訊,歡迎到 臉書粉絲專頁 按讚追蹤喔~
範例名稱:獲取口罩資料,改使用封裝過的 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,封裝 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.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 線上教室,臉書粉絲團,會不定期發佈相關資訊,不想錯過最新資訊,不要忘記來按讚,追蹤喔!也歡迎大家將這篇文章分享給更多人喔。
我們明天再見囉!!!掰掰~