1.为什么要使用回调机制
object HttpUtil {
fun sendRequest(address: String) {
thread {
try {
val client = OkHttpClient()
val request = Request.Builder()
.url(address)
.build()
val res = client.newCall(request).execute()
return@thread res //此处会报错,子线程中不允许返回数据
}catch (e: Exception) {
}
}
}
}
网络请求是异步进行的,那么如何才能在网络请求结束获取到数据之后通知调用的函数呢?答案就是接口回调,利用接口回调能让程序异步运行的同时,将获取到的数据返回给调用函数处理。
2.使用接口回调机制的步骤
1.定义所需接口
interface Response {
fun OnSuccess(result: String)
fun OnFailure(error: String)
}
2.在类中调用接口
object HttpUtil {
fun sendRequest(address: String, response: Response) {
thread {
try {
val client = OkHttpClient()
val request = Request.Builder()
.url(address)
.build()
val res = client.newCall(request).execute().toString()
response.OnSuccess(res)//调用接口的OnSuccess()方法
}catch (e: Exception) {
response.OnFailure(e.toString())//调用接口的OnFailure()方法
}
}
}
}
3.在需要获取数据的地方实现接口中的方法
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
HttpUtil.sendRequest("https://www.baidu.com", object : Response{ //利用匿名内部类实现接口中的方法,更新UI
override fun OnSuccess(result: String) {
data_text.text = result
}
override fun OnFailure(error: String) {
data_text.text = error
}
})
}
}