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

1 篇文章 0 订阅
1 篇文章 0 订阅

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


回调函数是指在编程,我们将一个函数作为参数传递给另一个函数,并在另一个函数执行完成后,通过调用该函数来完成一些特定的操作。简单来说,回调函数就是在某个事件触发后,执行的用户自定义的函数。 通俗地解释,可以想象你在餐厅点餐,你告诉服务员你要的菜品和口味。然后,你可以继续和朋友聊天,等待服务员将菜品做好后通知你,而不需要你一直等待。这里,你点餐并告诉服务员你的口味的过程就相当于设置了一个回调函数,当菜品做好后,服务员会调用你设置的回调函数来通知你。 在编程回调函数常常用于处理异步操作,比如网络请求、文件读写等。当这些操作完成后,系统会调用预先设置好的回调函数来处理操作的结果。这样可以提高程序的灵活性和性能。 回调函数的好处在于可以将程序分成多个模块,每个模块只关注自己的功能,而不需要关心其他模块的具体实现。同时,回调函数也可以根据不同的需求,灵活地进行扩展和定制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [回调函数传参c++_C语言回调和钩子函数嘛玩意?看这文章,回调和钩子函数一眼会...](https://blog.csdn.net/weixin_39913141/article/details/109962266)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值