天天看點

接口回調機制在網絡請求中的應用

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
                }
            })
        }
    }