1. 概念:A类中调用B类的某个方法C,然后B类中反过来调用A类中的方法D。D方法就是回调方法。
2.常见的回调方式:
背景1:ClassA 实现了CallBack
背景2:ClassA 包含ClassB的引用b
背景3:ClassB 有一个参数为callBack的方法f(CallBack callback)
A的对象a调用B的方法f(CallBack callback)
b在f(CallBack callback)中调用A的方法
3.举例
张三遇到一个问题,就打电话问李四,李四一下子也不知道,就跟张三说等我忙完就去想想答案,张三肯定不能一直拿着电话等李四,于是就对李四说我现在要出门,你知道了 答案就给我打电话。过了一个小时,李四打电话告诉张三,告诉他答案是什么。
/**
* CallBack 是一个回调接口
*/
public interface CallBack {
/**
* solve 是一个回调方法
*/
public void solve(String result);
}
/**
* 这个是张三 实现了一个回调接口CallBack,相当于----->背景一
*/
public class ZhangSan implements CallBack {
/**
* 张三持有李四对象的引用,相当于----->背景二
*/
public Lisi Li;
public ZhangSan(Lisi Li) {
this.Li = Li;
}
public void askQuestion(final String question) {
System.out.println("张三打电话问李四" + question);
/**
* 相当于 A类中调用B类中的方法f
*/
Li.executMessage(ZhangSan.this, question);
play();
}
public void play() {
System.out.println("张三挂断电话出门了");
}
/**
* 回调方法
*/
@Override
public void solve(String result) {
System.out.println("李四告诉张三的答案是" + result);
}
}
public class Lisi {
/**
* B类中参数为CallBack的方法f,相当于----->背景三
*/
public void executMessage(CallBack callBack, String question) {
System.out.println("张三接到电话,问题是" + question + "张三说他有事 忙完再想答案");
for (int i = 0; i < 5; i++) {
System.out.println("张三在忙");
}
for (int i = 0; i < 5; i++) {
System.out.println("张三忙完开始想问题");
}
String result = "2";
System.out.println("张三想到答案了" + result);
/**
* 李四打电话告诉张三,调用李四中的方法 这就相当于B类反过来调用A的方法D
*/
callBack.solve(result);
}
}