Java进阶之回调机制
平时经常听别人讲回调函数,听的我一脸懵逼,到底什么是回调函数,回调函数到底该怎么用?下面举例一一说明。
一、回调机制
所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法。
这样说是不是还是不太理解,其实我刚开始也是这样不理解,看看别人经典的回调方式:
Class A实现接口CallBack callback
Class A中包含一个class B的引用b
Class B有一个参数为callback的方法f(CallBack callback)
A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法 C
然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D
这样看还是不好理解,还是举个例子来说明吧,例子采用异步加回调:
“有一天李同学遇到一个很难的问题,问题是“1 + 1 = ?”,就打电话问张老师,张老师一下子也不知道,就跟李同学说,等我办完手上的事情,就去想想答案,李同学也不会傻傻的拿着电话去等张老师的答案吧,于是李同学就对张老师说,我还有其他事情,你知道了答案就打我电话告诉我,于是挂了电话,办自己的事情去了,过了一个小时,张老师打李同学的电话,告诉他答案是2”
二、代码示例
1、新建Callback回调接口:定义一个回调方法。
public interface CallBack {
//回调方法
public void solve(String result);
}
2、创建学生类(对应上面的class A)
public class Student implements CallBack{
private Teacher teacher;
public Student(Teacher teacher) {
this.teacher = teacher;
}
public void askQuestion(final String question){
System.out.println(teacher.getName() + "好! 我想问个问题:" + question);
new Thread(new Runnable() {
@Override
public void run() {
teacher.answerQuestion(Student.this, question);//ClassA中调用ClassB的方法
}
}).start();
System.out.println("问完了,我先去做其他事情了");
}
@Override
public void solve(String result) {
System.out.println(teacher.getName() + "告诉我答案是:" + result);
}
}
3、创建老师类(对应上面的classB)
public class Teacher {
private String name;
public Teacher(String name) {
this.name = name;
}
public String getName(){
return this.name;
}
public void answerQuestion(CallBack callBack, String question){
System.out.println("有同学提问:" + question);
//先处理其他事情
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//解答问题
callBack.solve("2");//调用ClassA的回调方法
}
}
4、创建测试类:
public class MainTest {
public static void main(String[] args){
Teacher missZhang = new Teacher("张老师");
Student studentLi = new Student(missZhang);
studentLi .askQuestion("1+1=?");
}
}
执行结果:
2017-03-17 17:53:101 5342 张老师好! 我想问个问题:1+1=?
2017-03-17 17:53:102 5342 问完了,我先去做其他事情了
2017-03-17 17:53:102 5342 有同学提问:1+1=?
2017-03-17 17:53:102 5347 张老师告诉我答案是:2
参考原文:http://blog.csdn.net/xiaanming/article/details/8703708/
PS: 更多原创技术好文和资料,请关注下方公众号:“测试开发栈”公众号是由具有多年测试、开发经验的老兵们共同管理和运营,旨在分享原创测试、开发相关技术,包括但不限于:测试方向:Web自动化测试、移动端自动化测试、Web服务端测试、接口测试等;开发方向:Java开发、Android开发、前端开发等;期望我们的经验和技术分享能让你每天都成长和进步,早日成为技术大牛~欢迎大家分享和转发我们的文章(分享转发请保留文章出处),以便让更多的朋友关注我们,同时也欢迎加入我们的QQ群交流和提问:427020613
