这几天在做项目的时候再次遇到了需要使用java回调机制来解决问题。之前在做android开发时其实会经常用到,比如对一个button绑定一个监听器,实现onclick方法,这样当用户点击屏幕时,就会处罚这个onclick方法,进而执行我们所需要的操作。这个onclick方法就可以说是一个回调方法,这个监听器完成的就是回调过程。在android中,我只遇到过一次需要自己写监听器的时候,隔了好久,又忘记了,这次又通过在网上找了好多帖子,才搞明白回调是咋个意思。为了方便自己以后再复习,也为了帮助那些仍然搞不清楚这个问题的朋友,决定写个文章。
高大上的说,回调机制就是控制反转的一种表现形式,简单的说,回调机制就是“好莱坞法则”,即“不要给我打电话,因为我会给你打电话”。再简单一点,就是A类调用B类方法,B类又反过来调用A类的方法。那么要实现回调机制需要有两个类,以及一个接口,当然如果你的程序需要很多接口时,你也可以再用一个类,把这些接口放到这个类里面,方便管理。不难看出,
这里举一个例子:想象这样一个情景:
期末考试的现场,监考老师发令:开始考试,下课准时交卷。学生则开始答卷,答到一半的时候你看了一下表,发现还剩半个小时就收卷了。最后下课铃响,老师发令:时间到了,从后往前收卷!
下面,我们来分析一下这个过程。在整个考试过程中,老师完成的工作是告诉学生开始考试和收卷的工作。学生则完成了答卷子和交卷的工作。这一过程中老师收卷这一动作的触发条件自然是时间到了,或者有学生提前交卷。收卷这个方法就是一个回调方法。下面我们通过代码进一步理解一下。
/**
* Created by ALexHao on 16/12/22.
*
* 这是一个接口的集合的类,当然不用类来管理也可以。
*/
public class callbackset {
//callback1接口
public interface callback1{
//教师收卷的回调方法
void shoujuan();
}
}
最终的运行结果就是:/**
* Created by ALexHao on 16/12/22.
*
* 学生类
*/
public class student {
//接口的声明与初始化
callbackset.callback1 callback = null;
public void setcallback(callbackset.callback1 callback){
this.callback = callback;
}
//模拟答卷子方法
//简单的计数器,数到一半时给予提示
public void dajuanzi(){
this.callback = callback;
for(int i=0;i<100000;i++) {
if(i==50000)
System.out.println("还剩办个小时就要下课了。。");
}
//时间到要交卷
jiaojuan();
}
//交卷方法,时间到了学生交卷,通知老师收卷
public void jiaojuan(){
System.out.print("时间到了!");
this.callback.shoujuan();
}
}/** * Created by ALexHao on 16/12/22. * * 教师类 */public class teacher{ //引用学生对象 student stu = null ; //传入参加本场考试的学生 public teacher(student stu) { this.stu = stu; } //发布开始考试的命令 public void kaishikaoshi(){ //学生设置回调接口,实现收卷的具体逻辑 stu.setcallback(new callbackset.callback1() { public void shoujuan() { System.out.println("从后往前收卷!"); } }); //新建线程 来执行答题过程 new Thread(new Runnable() { public void run() { System.out.println("开始考试,下课准时收卷!"); stu.dajuanzi(); } }).start(); }}/** * Created by ALexHao on 16/12/22. * * 主要的测试类 */public class maintest { public static void main(String[] args){ //学生入场 student stu = new student(); //教师入场 teacher tea = new teacher(stu); //教师发令:开始考试 tea.kaishikaoshi(); }}
在教师类中实现callback接口的另一种写法是使teacher类implement callback接口,这样就会出现熟悉的@override方法,在setcallback方法中只需要将teacher.this传入即可,效果相同。
希望通过这个简单的实例程序,可以帮助大家理解java当中的回调机制,如果我的描述中有任何欠妥的地方,欢迎大家批评指正~~