接口回调机制在网络请求中的应用

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

猜你喜欢

转载自blog.csdn.net/weixin_47885879/article/details/106713093