Day 12:封装 OkHttp

本篇文章同步发表在 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 线上教室,脸书粉丝团,会不定期发布相关资讯,不想错过最新资讯,不要忘记来按赞,追踪喔!也欢迎大家将这篇文章分享给更多人喔。

我们明天再见罗!!!掰掰~


<<:  [Java Day01] 大纲与安装

>>:  [Day 11] 简单的单元测试实作(五)

Day 1 - 简介与文章预计撰写方向

嗨,大家好,我叫Harvey 其实当我决定参加铁人赛时,我把铁人赛误解成马拉松,以为是一个礼拜发一篇...

Day11 HTML一

如果有一些编写网页的基础,在之後撰写爬虫程序时会比较轻松呦~ 接下来的几天,会简单地介绍HTML与C...

Vaadin login with Facebook - day28

目的 使用 Facebook 登入 本日重点 : 本篇使用 Facebook Graph API 登...

(10)建立基本类神经网路程序

参考网站:Keras官方指南   根据上面的参考网站,可以做出基本的类神经网路。   首先要先有基本...

D0 前言

D0 前言 自我介绍   哈罗大家好,我叫 sixwings,如果觉得 sixwings 发音很绕口...