学习Android之OkHttp

使用OkHttp

  有许多出色的网络通信库可以代替原生的HttpURLConnection,OkHttp尤其出色。

添加依赖

  在使用OkHttp之前,需要在项目中添加依赖:

    implementation 'com.squareup.okhttp3:okhttp:4.1.0'

  上述依赖会下载两个库:一个是OkHttp库,一个是Okio库,后者是前者的通信基础。

具体用法

  首先需要创建一个OkHttpClient的实例:

        val client = OkHttpClient()

  接下来如果要发起一条HTTP请求,就要创建一个Request对象:

        val request = Request.Builder()
            .url("https//www.baidu.com")
            .build()

  之后调用OkHttpClient的newCall()方法来创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据:

        val response = client.newCall(request).execute()

  Response对象就是服务器返回的数据了,如下写法来得到返回的具体内容:

        val responseData = response.body?.string()

  

  如果是发送一条POST请求,比GET请求复杂一点。

  需要先构建一个Request Body对象来存放待提交的参数:

        val requestBody = FormBody.Builder()
            .add("username", "admin")
            .add("password", "123456")
            .build()

  然后在Request.Builder中调用post()方法,并将RequsetBody对象传入:

        val request = Request.Builder()
            .url("https//www.baidu.com")
            .post(requestBody)
            .build()

 

  接下来的操作就和GET请求一样了,调用execute()方法发送请求并获取服务器返回的数据。

 

  简单应用一下:

    private fun sendRequestWithOkHttp() {
        thread { 
            try {
                val client = OkHttpClient()
                val request = Request.Builder()
                    .url("https//www.baidu.com")
                    .build()
                val response = client.newCall(request).execute()
                val responseData = response.body?.string()
                if(responseData != null) {
                    showResponse(responseData)
                }
            } catch (e: Exception){
                e.printStackTrace()
            }
        }
    }

  先开启子线程,再发出HTTP请求,注意调用showRedponse()方法,将服务器返回的数据显示到界面上。

 

网络请求回调的实现方式

  通常情况下我们会将通用的网络操作提取到一个公共的类里,并提供一个通用方法,当想要发起网络请求的时候,只需简单地调用一下这个方法即可。比如:

object HttpUtil {
    fun sendOkHttpRequest(address: String, callback: okhttp3.Callback) {
        val client = OkHttpClient()
        val request = Request.Builder()
            .url(address)
            .build()
        client.newCall(request).enqueue(callback)
    }
}

  该方法的第二个参数是okhttp3.Callback,这是OkHttp库中自带的回调接口,然后在client.newCall()之后也没有调用之前execute()方法,而是enqueue()方法,并传入了okhttp3.Callback参数,因为enqueue方法的内部已经开启了子线程,这样就会在子线程中执行HTTP请求,并将请求结果回调到okhttp3.Callback中。

  写法如下:

        HttpUtil.sendOkHttpRequest("www.baidu.com", object : okhttp3.Callback {
            override fun onFailure(call: okhttp3.Call, e: IOException) {
                TODO("Not yet implemented")
            }
            override fun onResponse(call: okhttp3.Call, response: okhttp3.Response) {
                val responseData = response.body?.toString()
            }
        })

  回调接口都是在子线程中运行的,因此不可以在这里执行任何的UI操作,除非借助runOnUiThread()方法来进行线程转换。

 

posted @ 2022-03-14 22:04  PeacefulGemini  阅读(280)  评论(0)    收藏  举报
回顶部