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()
[email protected] 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
}
})
}
}