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等,其实都是一个个的回调机制