Java接口回调的自我理解
在近期做获取通话记录的app的时候,设置RecycleView的每一个item的单击时间监听器的时候卡了很久(wtcl),因为涉及到接口回调,特此开一篇博客来说说自己的理解,以加深对这个抽象概念的认识。
概念
- 什么是接口(Interface)?
- 接口是java语言的一种抽象类型,包含抽象方法(即没有方法的具体实现),一个类通过继承接口从而来继承接口的抽象方法。
- 接口和类的不同之处
1) 接口不能被实例化(没有构造方法)
2) 接口中的方法都必须是抽象方法(即没有实现,只有声明)
3) 接口不能包含成员变量,除了static和final变量
4) 不能说类继承接口,而是说类实现了这个接口
5) 接口可以多继承。
- 什么是回调?
- 回调是调用方式的一种,调用方式可以分为三类:
1) 同步调用:一种阻塞式的调用,即我们常用的在函数A中通过书写函数B的名字调用这个函数,这样要等待B函数执行完毕后A才能继续执行。
2) 异步调用:类似Android的标准广播机制,同时受到且互不影响。
3) 回调: 回调是一种双向的调用模式,也就是说,被调用的接口被调用时也会调用对方的接口,例如A要调用B,B在执行完毕后又要调用A。 - 回调一般用于不同层级间的协作,上一层级将他的函数安装在下层,这个函数就是回调函数,而下层在一定条件下会出发回调。
- 回调是调用方式的一种,调用方式可以分为三类:
- 什么是接口回调?
- 较为简单的例子
背景:xxjj对hllj说,你快点学习,我把我的联系方式给你,一旦一学习完了马上用这个联系方式给我解释你学了什么。联系方式——>xxjj对象的引用
给我解释你学了什么——>这个接口的抽象方法的具体实现
先创建一个回调接口
1
2
3public interface ExplainToXxjj{
public void doExplain();//这里创造了一个接口,实现这个接口的类必须实现这个抽象方法。
}创建实现ExplainToXxjj接口的一个类
1
2
3
4
5public class Xxjj implements ExplainToXxjj{
public void doExplain(){
System.out.println("向xxjj解释什么是接口回调");//这里的Xxjj类实现了ExplainToXxjj接口
}
}创建控制改接口何时回调时的类,需要得到Xxjj的地址(即回调接口)
1
2
3
4
5
6
7
8
9
10public class Hllj{
ExplainToXxjj explainToXxjj;//声明一个接口变量
public Hllj(ExplainToXxjj explainToXxjj){
this.explainToXxjj = explainToXxjj;
}//在构造方法中,将接口变量的值初始化
public void learn(){
System.out.println("学习中...");
explainToXxjj.doExplain();//在这里实现了回调,即通过接口变量调用被调用类实现的接口的方法(doExplain())
}
}测试类
1
2
3
4
5
6
7public class Test{
public static void main(String [] args){
Xxjj xxjj = new Xxjj;//创建一个新的Xxjj实例
Hllj hllj = new Hllj(xxjj);//创建一个新的Hllj实例,并将刚才新建的Xxjj对象传进构造器。构造器则将这个实例的引用赋给了接口变量。
hllj.learn();//此时调用Hllj的learn方法,然后learn方法中可以调用到Xxjj对象所实现的doExplainToXxjj方法。
}
}
代码运行过后的结果是:
学习中...
向Xxjj解释什么是接口回调
假如Xxjj把ExplainToXxjj的实现改成”一起BBT”那就是另一个故事了。
是不是感觉逻辑其实很简单,可以看做interface变量充当了C艹里的对象的指针(?个人理解233333不一定对奥)
- 在Android开发中,接口回调被大量的使用,比如每一个单击事件监听器都使用了接口回调的方法,下面举例一个实际开发中的例子,为RecycleView的每一个item的单击事件监听器。