网络请求回调的实现方式
通常情况下,我们不可能在所有需要网络操作的地方都写一遍HTTP请求。
因此写成一个公共类是最好的选择。
比如以下写法:
object HttpUtil {
fun sendHttpRequest(address:String):String{
var connection : HttpURLConnection? =null
try {
val response = StringBuilder()
val url = URL(address)
connection = url.openConnection() as HttpURLConnection
connection.connectTimeout = 8000
connection.readTimeout = 8000
val input = connection.inputStream
val reader = BufferedReader(InputStreamReader(input))
reader.use {
reader.forEachLine {
response.append(it)
}
} return response.toString()
}catch (e:Exception){
e.printStackTrace()
return e.message.toString()
}finally {
connection?.disconnect()
}
}
}
当需要发送HTTP请求时,则可以这样子写:
val address = "https://www.baidu.com"
val response = HttpUtil.sendHttpRequest(address)
注意:网络请求通常属于耗时操作,这里并没有开启线程操作。
而解决这个问题并不可以单纯在sendHttpRequest开一个子线程,这样子会使得sendHttpRequest在服务器还没来得及响应的时候就结束了。
这种情况需要使用到编程语言的回调机制。
定义接口
interface HttpCallbackListener {
fun onFinish(response:String)
fun onError(e:Exception)
}
这里定义了两个方法,onFinish是在服务区成功响应时我们请求的时候调用,onError则表示在网络操作出现错误的时候调用。
修改HttpUtil
fun sendHttpRequest(address:String, listener:HttpCallbackListener){
thread {
var connection : HttpURLConnection? =null
try {
...
//回调使用onFinish()方法
listener.onFinish(response.toString())
}catch (e:Exception){
e.printStackTrace()
//回调使用方法
listener.onError(e)
}finally {
connection?.disconnect()
}
}
}
由于在子线程中无法直接return返回数据,因此将数据传给类型为HttpCallbackListener的参数
现在sendHttpRequest方法需要接收两个参数,调用时还需要将HttpCallbackListener参数传入,如下所示:
HttpUtil.sendHttpRequest(address, object: HttpCallbackListener){
override fun onFinish(response :String){
}
override fun onError(e:Exception){
}
}
假如使用OKHttp会怎么样?答案是简单得多了
使用OKHttp
fun sendOkHttpRequest(address: String, callback: okhttp3.Callback){
val client = OkHttpClient()
val request = Request.Builder()
.url(address)
.build()
client.newCall(request).enqueue(callback)
}
可以看到这里有两个参数,第二个参数是OkHttp库中的一个回调接口
然后在client.newCall()并没有使用之前的execute方法,而是调用了enqueue。
这个方法相当于已经帮忙开了一个子线程,然后会在子线程中执行Http请求,将结构回调到kokhttp3.Callback中
因此我们在调用时可以这么写。
HttpUtil.sendOkHttpRequest(address, object: Callback){
override fun onReponse(cal:Call ,response :Response){
//得到服务器返回的具体内容
val responseData = response.body?.string()
}
override fun onFailure(cal:Call,e:Exception){
//对异常进行处理
}
}
文章介绍了如何实现网络请求回调,首先通过HttpURLConnection创建公共的网络请求方法,然后通过定义HttpCallbackListener接口处理异步回调。接着,展示了使用OkHttp库进行网络请求,利用其内置的Callback接口进行回调,简化了异步操作。
1308

被折叠的 条评论
为什么被折叠?



