java——回调机制(callback)

时间:2021-01-08 04:38:03

回调机制是什么哪?先上一幅图来说明一下吧,这里用老师问问题,学生回答问题为例子,解释一下回调机制的使用

java——回调机制(callback)

首先需要一个接口callback,以及一个继承了接口的类Teacher。Teahcer类中有另一个类Student的对象,在Teacher中执行函数,会调用student中的方法,student执行对应方法后再回调Teacher中重写的接口方法,这样就完成了一次回调方法。

 

1. 首先定义一个回调的接口

package callBackTest;

public interface Callback {
public void tellAnswer(int answer);

}

2. 接下来定义老师的类,实现这个接口(老师类内部需要包含一个学生的对象)

package callBackTest;

public class Teacher implements Callback {
private Student student;

public Teacher(Student student){
this.student = student;
}

public void askQuestion(final String question){
System.out.println(
"Teacher ask a question: "+ question); //提出一个问题
student.resolveQuestion(
this,question); //询问学生
System.out.println(
"Teacher: do someting else"); //忙自己的事
}

@Override //重写回调函数
public void tellAnswer(int answer){
System.out.println(
"your answer is: " + answer);
}

}

3. 最后定义学生的类

package callBackTest;

public class Student {

public void resolveQuestion(Callback callback, final String question){

System.out.println(
"Student receive the question: " + question); //学生收到老师的问题
System.out.println(
"Student: I am busy");
doSomething(); //学生在忙其他的事
callback.tellAnswer(
2); //忙完之后回答问题
}

public void doSomething(){
try {
Thread.sleep(
2000);
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

4. 最后我们来测试一下回调机制

package callBackTest;

public class Test {
public static void main(String[] args){
Student st
= new Student();
Teacher th
= new Teacher(st);
th.askQuestion(
"1+1=?");
}

}

我们看看运行后的结果

Teacher ask a question: 1+1=?
Student receive the question:
1+1=?
Student: I am busy
your answer is:
2
Teacher:
do someting else

从运行结果可以看出,这里的回调机制其实是同步的,也就是说老师问过问题之后,会阻塞在那里,等待学生回答问题,然后才会去做自己的事情。

但实际中,老师问完问题,并不会等待学生回答,而是继续做其他的事情,也就是异步回调

实现异步回调,我们只需要修改Teacher这个类就可以了,将调用学生回答问题的操作封装在一个线程中就可以了,也就是黄色部分。

package callBackTest;

public class Teacher implements Callback {
private Student student;

public Teacher(Student student){
this.student = student;
}

public void askQuestion(final String question){
System.out.println(
"Teacher ask a question: "+ question);
new Thread(new Runnable(){

@Override
public void run() {
// TODO Auto-generated method stub
student.resolveQuestion(Teacher.this
,question); //这里需要注意必须声明是Teacher.this

}

}).start();

System.out.println(
"Teacher: do someting else");
}

@Override
public void tellAnswer(int answer){
System.out.println(
"your answer is: " + answer);
}

}

我们再来看看运行后的结果,这里可以看出老师问过问题后就去忙自己的事情了,等学生回答完问题之后,就回调了自己的函数tellAnswer

Teacher ask a question: 1+1=?
Teacher:
do someting else
Student receive the question:
1+1=?
Student: I am busy
your answer is:
2

 

Android中也使用了很多的回调机制,最常见的一个就是onClickListener,还有handle等,其实都是一个个的回调机制