学习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()方法来进行线程转换。

浙公网安备 33010602011771号