通俗易懂地理解Java中的回调机制到底是咋回事

时间:2021-08-07 08:35:33

这几天在做项目的时候再次遇到了需要使用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();    }}
最终的运行结果就是:
通俗易懂地理解Java中的回调机制到底是咋回事

在教师类中实现callback接口的另一种写法是使teacher类implement callback接口,这样就会出现熟悉的@override方法,在setcallback方法中只需要将teacher.this传入即可,效果相同。

希望通过这个简单的实例程序,可以帮助大家理解java当中的回调机制,如果我的描述中有任何欠妥的地方,欢迎大家批评指正~~