同步方式请求
由于android不允许在UI线程中进行网络请求,因此需要开一个子线程。
get请求:
private fun syncGet(){
Model.excutors.execute{ //开启子线程
val client = OkHttpClient()
val request = Request.Builder().url("http://www.httpbin.org/get?m=1").build()
val response = client.newCall(request).execute()
runOnUiThread {
//在ui线程更新数据
binding.okHttpDemoResult.text = response.body?.string()
}
}
}
post请求:
private fun syncPost(){
Model.excutors.execute{
val client = OkHttpClient()
val formBody = FormBody.Builder()
.add("username","user")
.add("password","123456")
.build()
val request = Request.Builder().url("http://www.httpbin.org/post").post(formBody).build()
val response = client.newCall(request).execute()
runOnUiThread {
binding.okHttpDemoResult.text = response.body?.string()
}
}
}
异步方式请求
okhttp3内部已经开启了子线程,因此可以再UI线程中直接使用。注意:callback中的方法没在UI线程,需要将数据传递到UI线程进行更新。
get请求:
private fun asyncGet(){
val client = OkHttpClient()
val request = Request.Builder().url("http://www.httpbin.org/get?m=1").build()
client.newCall(request).enqueue(object :okhttp3.Callback{
override fun onFailure(call: Call, e: IOException) {
runOnUiThread {
binding.okHttpDemoResult.text = e.toString()
}
}
override fun onResponse(call: Call, response: Response) {
runOnUiThread {
binding.okHttpDemoResult.text = response.body?.string()
}
}
})
}
post请求:
private fun asyncPost(){
val client = OkHttpClient()
val formBody = FormBody.Builder()
.add("username","username")
.add("password","123456")
.build()
val request = Request.Builder().url("http://www.httpbin.org/post").post(formBody).build()
client.newCall(request).enqueue(object:okhttp3.Callback{
override fun onFailure(call: Call, e: IOException) {
runOnUiThread {
binding.okHttpDemoResult.text = e.toString()
}
}
override fun onResponse(call: Call, response: Response) {
runOnUiThread {
binding.okHttpDemoResult.text = response.body?.string()
}
}
})
}