1 什么是回调 一般来说,模块之间都存在一定的调用关系,从调用方式来看,分为三类: 一:同步调用:这也是一种阻塞式调用,就是这函数A的函数体中通过书写函数B的名字来调用,让函数B的代码得以执行。 二:异步调用:它解决了同步阻塞的问题,在函数A里面调用B函数,如果B函数是耗时的,不需要等B执行完,A可以马上执行后面的代码。 三:回调:回调是一种双向的调用模式,也就是说:被调用的接口被调用时也会调用对方的接口,比如A要调用B,在B执行完又要调用A。 2 回调使用场景: 它通常用于处理用户交互,网络请求等不确定时间发生的事件。 3 怎么使用
首先定义接口:
interface OnItemClickListener {
fun onItemClick(position: Int)
}
private lateinit var mOnItemClickListener: OnItemClickListener
//定义一个外部暴露的方法供赋值
fun setOnItemClickListener(onItemClickListener: OnItemClickListener) {
mOnItemClickListener = onItemClickListener
}
这里是调用接口里面的方法
holder.tvContent.setOnClickListener {
mOnItemClickListener?.onItemClick(position)
}
再看我们实现这个接口的地方:
可以理解为:Java中接口是不可以创建实例的,现在把接口声明了一个变量,当我继续再执行接口中的方法,由于接口没有怎么办呢?由于多态机制,这是虚拟机会去找其子类,调用其子类中已经重载的该方法,这就是接口回调的本质。
然而我们在Kotlin中,函数是一等公民,我们可以把这种接口回调简单化:
我们调用就这么写:传一段代码进去,高阶函数。