1.为什么需要回调函数这个概念
1.funcA()调用funcB(param),并且需要得到funcB(param)返回的result,这时才需要用到回调函数,不然只需要开启异步线程即可
2.funcA(){
result = funcB(param);
需要借助result才能完成的业务;
不需要result也能完成的业务;
}
假如这时,funcB(param)需要执行20s,那我们A需要等20s才能进行下面的操作,这时我们考虑异步调用
3.funcA(){
result = funcB(param);这步我们开启Thread异步调用
需要借助result才能完成的业务;
不需要result也能完成的业务;
}
虽然这里调用B是异步调用的,但是必须要等待thread返回结果,我们才能执行下面的内容
所以你可能非常容易想到2中解决方案
1.主线程for循环判断reuslt是否返回
2.阻塞等待result返回之后再执行
这样跟不开启线程的效果一样
4.所以我们进一步考虑,将主线程中需要借助result才能完成的业务放到funcB()中
这样,主线程可以接着完成不需要result就能执行的业务,这样效果会大大提升
5.但是不能将它写死到funcB中,所以我们想要是能将需要借助result才能完成的业务
抽取成callback()方法,然后通过传参的方式,传给 funcB(param,callback)
6.这里我们将callback设计成一个接口,里面的方法定义成需要result才能执行的业务
然后funcA()调用者趋去实现,callback接口,这样我们传参数的时候,funcB(param,new A())即可,
7.public interface CallBack{
Object callBack(Object result);
}
public class A implents CallBack{
public void funcA(){
funcB(param,this); 这里开启了Thread;
不需要reuslt就可以执行的业务;这里可以不用等待funcB返回,直接执行
}
public Object callBack(Object result){
需要result 才能执行的A的业务;
}
}
public class B{
public void funcB(Object param,Callback callBack){
do ....,有了result;
callback.callback(result);
}
}
8.简单来说,为了提高调用的效率,采用异步回调函数,既可以解放funcA(),让起不用等待funcB()执行完后再执行
funcB执行完后,直接调用回调函数,其核心就是回调函数接口