回調(diào)的基本概念
在java中,我們可以將回調(diào)簡單理解為:類A中的a方法調(diào)用類B中的b方法,而類B的b方法有反過來調(diào)用類A中的回調(diào)方法(callBack())。

回調(diào)還可以分為同步回調(diào)和異步回調(diào)
同步回調(diào)
先看下面例子:
代碼清單1:ICallBack.java
/**
* 回調(diào)接口
* @author 葉漢偉
* @version v1.0
*/
public interface ICallBack {
public void callBack();
}
代碼清單2:A.java
/**
* 類A,繼承并實現(xiàn)接口ICallBack
* @author 葉漢偉
* @version v1.0
*/
public class A implements ICallBack{
public void afunc(B b){
System.out.println("A調(diào)用B的函數(shù)...");
b.bfunc(this);
}
@Override
public void callBack(){
System.out.println("執(zhí)行A的回調(diào)函數(shù)");
}
}
代碼清單3:B.java
/**
* 類B,調(diào)用類A的回調(diào)方法
* @author 葉漢偉
*@version v1.0
*/
public class B {
public void bfunc(ICallBack _callBack){
System.out.println("B調(diào)用A的“回調(diào)函數(shù)”");
_callBack.callBack();
}
}
代碼清單4:Test.java
public class Test {
public static void main(String[] args){
A _a=new A();
B _b=new B();
_a.afunc(_b);
}
}
運行結(jié)果:
A調(diào)用B的函數(shù)... </br>
B調(diào)用A的“回調(diào)函數(shù)”...</br>
執(zhí)行A的回調(diào)函數(shù)...
回調(diào)結(jié)束!
根據(jù)以上例子分析,同步回調(diào)是執(zhí)行A的afunc()函數(shù),到調(diào)用B的bfunc()函數(shù)執(zhí)行回調(diào),直到回調(diào)結(jié)束后程序再返回afunc()函數(shù)繼續(xù)執(zhí)行。

可見同步回調(diào)是一種順序的,阻塞的程序調(diào)用,若回調(diào)函數(shù)的處理需要的時間久一點,就會造成程序無法繼續(xù)向下執(zhí)行,降低應(yīng)用的整體性能。
異步回調(diào)
保持ICallBack.java和Test.java不變,重構(gòu)A.java和B.java,將同步回調(diào)改成異步回調(diào)。代碼如下:
代碼清單5:A.java
/**
* 類A,繼承并實現(xiàn)接口ICallBack
* @author 葉漢偉
* @version v2.0
*/
public class A implements ICallBack{
public void afunc(B b){
System.out.println("A調(diào)用B的函數(shù)...");
new Thread(new Runnable() {
@Override
public void run() {
b.bfunc(A.this);
}
}).start();
System.out.println("afunc()函數(shù)執(zhí)行完畢!");
}
@Override
public void callBack(){
System.out.println("執(zhí)行A的回調(diào)函數(shù)...");
}
}
代碼清單6:B.java
/**
* 類B,調(diào)用類A的回調(diào)方法
* @author 葉漢偉
*@version v2.0
*/
public class B {
public void bfunc(A a){
System.out.println("B調(diào)用A的“回調(diào)函數(shù)”...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}
a.callBack();
System.out.println("回調(diào)結(jié)束!");
}
}
運行結(jié)果:
A調(diào)用B的函數(shù)...
afunc()函數(shù)執(zhí)行完畢!
B調(diào)用A的“回調(diào)函數(shù)”...
執(zhí)行A的回調(diào)函數(shù)...
回調(diào)結(jié)束!
可見,異步回調(diào)中,程序不會等回調(diào)執(zhí)行完后再繼續(xù)執(zhí)行剩余程序,而是另起線程,一邊繼續(xù)執(zhí)行剩余程序,一邊執(zhí)行回調(diào)程序,等回調(diào)執(zhí)行完后返回結(jié)果。