先让我们通过一个生活中的场景来还原一下回调的场景:你遇到了一个技术难题(比如,1+1等于几?太难了!),于是你去咨询大牛,大牛说现在正在忙,待会儿告诉你结果。
此时,你可能会去刷朋友圈了,等大牛忙完之后,告诉你答案是2。
那么,这个过程中询问问题(调用对方接口),然后问题解决之后再告诉你(对方处理完再调用你,通知结果),这一过程便是回调。
系统调用的分类
应用系统模块之间的调用,通常分为:同步调用,异步调用,回调。
如果A调用B,B的执行时间比较长,那么就需要考虑进行异步处理,使得B的执行不影响A。通常在A中新起一个线程用来调用B,然后A中的代码继续执行。
异步通常分两种情况:第一,不需要调用结果,直接调用即可,比如发送消息通知;第二,需要异步调用结果,在Java中可使用Future+Callable实现。
通过上图我们可以看到回到属于一种双向的调用方式。回调的基本上思路是:A调用B,B处理完之后再调用A提供的回调方法(通常为callbakc())通知结果。
通常回调分为:同步回调和异步回调。网络上大多数的回调案例都是同步回调。
其中同步回调与同步调用类似,代码运行到某一个位置的时候,如果遇到了需要回调的代码,会在这里等待,等待回调结果返回后再继续执行。
而异步回调与异步调用类似,代码执行到需要回调的代码的时候,并不会停下来,而是继续执行,当然可能过一会回调的结果会返回回来。
同步回调实例
下面我们以同步回调为例来讲解回调的Java代码实现。整个过程就模拟上面问答问题的场景。
首先,定义给一个CallBack的接口,将回调的功能进行单独抽离:
public interface CallBack {
void callback(String string);
}
CallBack接口中提供了一个callback方法,用于回调时调用。