一、关于回调函数的概念
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
从上面的这段阐述之中,我们不难发现两点。
- 函数回调就是将函数指针的地址当作参数传递给另一个函数。
- 函数回调的用途简单来说就是进行事件的响应或者事件触发。
既然我们知道回调函数的用途是事件的响应,那么我们就从这里入手。 假设我们有这样一个场景,一家人坐在一起吃饭,但是我们中国的规矩是,长辈没动筷子,小辈们是不能动的,所以必须等着长辈动筷子这一事件完成之后,小辈们才能开始。 接下来我们就用回调函数来解决。由于java中没有指针一说,故而也没了,但是java提供了 接口帮我们实现 回调函数,俗称 接口回调。
二、Java的回调函数(接口回调)
接口是必须依赖, 不过不是一定要自己声明接口
Android中本身就有一堆接口, 例如Runnable
, 点击事件接口等等, 只要这些接口能满足你的需要, 你可以直接使用, 不用自己声明新的接口了.
另外接口最大的意义是在代码结构层面上的, 一定程度上解耦调用接口的类和被调用的接口实现, 这意味着需求改变的时候只需要改接口的实现而不需要改使用接口的类, 如果你的项目是长期维护的话, 以后你就会觉得幸亏有这一大堆代码了**.**
其实没有规定一定要用接口,java中回调写得这么麻烦无非就是因为不支持方法参数,所以方法参数用类,类再调用方法来实现,接口不是必须的,随手写一个吧:但代码会十分冗余,如果用接口只需每次用实现类即可
使用类作为方法参数
public class Test1 {
public void method1(Test2 test2){
test2.method2(this);
}
public void showName(){
System.out.println("test1");
}
public static void main(String[] args) {
new Test1().method1(new Test2());
}
}
class Test2{
public void method2(Test1 test1){
test1.showName();
}
}
说接口完全没有错,接口是在类层次之上的东西,抽象程度更高,接口来定义回调再合适不过,类在这有些冗余其实。 如果按照上述
使用接口作为方法参数
public class Caller {
public void call(CallBack callBack){
System.out.println("我是普通方法-start");
//回调函数
callBack.callBackk();
System.out.println("我是普通方法-end");
}
}
public interface CallBack {
void callBackk();
}
public class Test {
public static void main(String[] args) {
Caller caller = new Caller();
/*CallBack callBack = new CallBack() {
@Override
public void callBack() {
}
};*/
CallBack callBack = () -> System.out.println("我要疯了~对于回调函数~");
caller.call(callBack);
}
}