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

来源:互联网 发布:程序员必读书籍 知乎 编辑:程序博客网 时间:2024/05/01 15:43

这几天在做项目的时候再次遇到了需要使用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当中的回调机制,如果我的描述中有任何欠妥的地方,欢迎大家批评指正~~


1 0
原创粉丝点击