回调函数简单点说就是:A调用B中的方法,B方法执行结束后,再调用A中的方法,而该方法就是回调函数。
下面举个例子,该例子的主要思想是:A打电话给B,叫B帮忙买东西,B会给A回电话东西是否买到了。
接口类:Callback.java
package lifeixu.com.callback;
public interface Callback {
//回调函数,A调用B的方法,B开始执行,B执行结束后,调用A的方法,所以该方法由A来实现
public void bCALLa(String result);
}
A.java
public class A implements Callback {
private B b;
public A(B li) {
this.b = li;
}
//A打电话叫B帮忙买东西
public void buyByCall(String something) {
System.out.println("A--->A要买的东西是: "+something);
new Thread(new Runnable(){
@Override
public void run() {
//***1.A调用B的函数,将A要买的东西传给B,并注册回调函数
b.buySomething(A.this, something);
}
}).start();
play();
}
public void play() {
System.out.println("A--->A边看电视边等B电话");
}
@Override
public void bCALLa(String result) {
System.out.println("A--->A等到B的电话,结果是:"+result);
}
}
B.java
public class B {
private String result = "东西没有买到";
public void buySomething(Callback callback, String something) {
//***2.B执行自己的方法
result = shoping(something);
//***3.等待B执行结束后,B调用A的函数,B打电话给A东西买好了
callback.bCALLa(result);
}
public String shoping(String something){
System.out.println("B--->B要帮A买的东西是:"+something);
System.out.println("B--->B开始帮A买:"+something);
//模拟B买东西,花费一定的时间
for(int i=0;i<1000000;i++) {
}
System.out.println("B--->B帮A买好了:"+something);
result = something+"买到了";
return result;
}
}
测试类:Test.java
public class Test {
public static void main(String[] args) {
testAB();
}
public static void testAB() {
B b = new B();
A a = new A(b);
a.buyByCall("苹果");
}
}
测试结果:
A--->A要买的东西是: 苹果
A--->A边看电视边等B电话
B--->B要帮A买的东西是:苹果
B--->B开始帮A买:苹果
B--->B帮A买好了:苹果
A--->A等到B的电话,结果是:苹果买到了
再附加个简单的callback例子:
接口类:CallbackInterface.java
public interface CallbackInterface {
public void callback();
}
MethodTime.java
public class MethodTime {
private CallbackInterface callbackInterface;
public MethodTime(CallbackInterface callbackInterface) {
this.callbackInterface = callbackInterface;
}
public void methodTime() {
long start = System.currentTimeMillis();
System.out.println("start time: " + start);
callbackInterface.callback();//需要计算时间的方法
long end = System.currentTimeMillis();
System.out.println("end time: " + end);
System.out.println("use time: " + (end - start));
}
}
测试类:Test.java
public class Test {
public static void main(String[] args) {
testMethodTime();
}
public static void testMethodTime() {
MethodTime mt = new MethodTime(new CallbackInterface() {
@Override
public void callback() {
for(int i=0;i<100000000;i++) {
}
}
});
mt.methodTime();
}
}