本人学生期间代码接触的都是C++与Matlab,在工作之后由于从事android开发需要接触java开发,于是边学边用,其中踩了不少坑,记录下来大家一起阅读。
1.定义
什么是回调函数?是一个通过函数指针调用的函数。英文为CALLBACK,call then back,回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件进行响应。在JAVA中可以特定理解为:通过函数参数传递到其他代码的,某一块可执行代码的引用。
2.分类
一般将回调函数分为两类:同步回调、异步回调。
3.同步回调
同步回调会等回调函数执行完之后再处理其他业务。
以上学为例:高中生出门上学,由于路程比较近,因此可以使用同步回调
回调函数的接口:
public interface Callable {
//回调函数
public void call();
}
父母类:
//定义父母类实现Callable接口,也要实现call()回调函数的具体内容
public class Parents implements Callable {
Student stud;
public Parents(Student stud) {
this.stud = stud;
}
//表示stud离开家去上学
public void leavehome() {
System.out.println("Synchronous callback function starts.");
stud.gotoschool(this);
System.out.println("Synchronous callback function ends.");
}
@override
public void call() {
System.out.println("stud arrive at school.");
}
}
学生类:
public class Student {
public void gotoschool(Callable callable) {
try {
Thread.sleep(50);
} catch(Exception e) {
System.out.println(e.getMessage());
}
callable.call();
//调用回调函数
}
}
测试类:
public class Test {
public static void main(String[] args) {
Student stud = new Student();
Parents part = new Parents(stud);
part.leavehome();
}
}
编译结果:
Synchronous callback function starts.
stud arrive at school.
Synchronous callback function ends.
4.异步回调
有的时候,我们不希望程序在某个执行方法上一直阻塞,需要先执行后续的方法,那就是这里的异步回调。我们在调用一个方法时,如果执行时间比较长,我们可以传入一个回调的方法,当方法执行完时,让被调用者执行给定的回调方法。或者某些业务十分耗时,又需要立即返回结果,这个时候需要开辟新的线程处理耗时业务,业务处理完了,再去回调回调函数,处理其他业务。
还是上述例子,不过这回是大学生上学校,路途较远。
学生类:
public class Student {
public void gotoschool(int time, Callable callable) {
try {
Thread.sleep(time);
} catch(Exception e) {
System.out.println(e.getMessage());
}
callable.call();
//调用回调函数
}
}
高中生父母类:
//定义父母类实现Callable接口,也要实现call()回调函数的具体内容
public class Parents1 implements Callable {
Student stud;
public Parents1(Student stud) {
this.stud = stud;
}
//对Parents类中的leavehome()函数进行修改
public void leavehome() {
System.out.println("Asynchronous callback function starts.");
new Theard(new Runable() {
@override
public void run() {
stud.gotoschool(500,Parents.this);
}
}).start();
System.out.println("Asynchronous callback function ends.");
}
@override
public void call() {
System.out.println("Parents1's stud arrive at school.");
}
}
大学生父母类:
//定义父母类实现Callable接口,也要实现call()回调函数的具体内容
public class Parents2 implements Callable {
Student stud;
public Parents2(Student stud) {
this.stud = stud;
}
//对Parents类中的leavehome()函数进行修改
public void leavehome() {
System.out.println("Asynchronous callback function starts.");
new Theard(new Runable() {
@override
public void run() {
stud.gotoschool(50000,Parents.this);
}
}).start();
System.out.println("Asynchronous callback function ends.");
}
@override
public void call() {
System.out.println("Parents2's stud arrive at school.");
}
}
测试类:
public class Test {
public static void main(String[] args) {
Student stud = new Student();
Parents1 part1 = new Parents1(stud);
part1.leavehome();
Parents2 part2 = new Parents2(stud);
part2.leavehome();
}
}
编译结果是:
Asynchronous callback function starts.
Asynchronous callback function ends.
Asynchronous callback function starts.
Asynchronous callback function ends.
Parents1's stud arrive at school.
Parents2's stud arrive at school.
5.总结
因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的函数的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
6.应用场景
1 回调函数可以用于事件监听,当发生相对应的事件时系统可以自动调用对应的函数
2 回调函数可以用于中断处理。