资讯专栏INFORMATION COLUMN

Java 基础复习实践 --- CallBack

shadowbook / 1786人阅读

摘要:很早之前不知道如何解释清楚回调函数,在知乎上看到一个回答特别形象,当时就收藏了,所以今天决定用代码的形式再让这个回答更加深刻点。

很早之前不知道如何解释清楚回调函数(CallBack),在知乎上看到一个回答特别形象,当时就收藏了,所以今天决定用代码的形式再让这个回答更加深刻点。

知乎-回调函数(callback)是什么?

然后再看看 Android 里的应用。

什么是回调函数

Android 里常见的回调

什么是回调函数

维基的解释:

在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。

我认为通俗易懂的解释:

你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。回答完毕。

可能看着通俗的解释能够知道是怎么回事,但是轮到自己要去实现一个回调的时候,就有点寸步难行了。所以我简单将那个解释,转换成了代码再解释一番。

首先我得定义一个接口(我的电话号码):

public interface INumber {
    public void onCall();
}

我去商店买东西,该商店对象刚刚初始化:

Store store = new Store();

然后我才得知商店刚刚开门没有我要的货(商店构造函数):

public class Store {
    public Store() {
        Utils.sout("才开店,没有货");
        Utils.sout("=============");
    }
}

所以我把我的电话号码留给店员,对于店员来说就是得到我的电话号码(注册事件):

private INumber number;

public void setNumber(INumber number) {
    this.number = number;
}

public void call() {
    number.onCall();
}
/**************注册前的准备工作完毕**************/
public static void main(String[] args) {
    Store store = new Store();
    // 先注册好事件
    store.setNumber(new INumber() {
        @Override
        public void onCall() {
            Utils.sout("=============");
            Utils.sout("货到了");
        }
    });
    for (int i = 1; i < 4; i++) {
        Utils.sout("模拟取货:" + i + "小时");
    }
    // 货到了就打电话通知我
    store.call();
}

整体控制台输出:

才开店,没有货

= = = = = = = = = = = = =
模拟取货:1小时
模拟取货:2小时
模拟取货:3小时
= = = = = = = = = = = = =
货到了

-
商店类的完整代码:

public class Store {

    public Store() {
        Utils.sout("才开店,没有货");
        Utils.sout("=============");
    }

    private INumber number;

    public void setNumber(INumber number) {
        this.number = number;
    }

    public void call() {
        number.onCall();
    }

    public static void main(String[] args) {

        Store store = new Store();

        store.setNumber(new INumber() {
            @Override
            public void onCall() {
                Utils.sout("=============");
                Utils.sout("货到了");
            }
        });

        for (int i = 1; i < 4; i++) {
            Utils.sout("模拟取货:" + i + "小时");
        }

        store.call();
    }

}
Android 里常见的回调

我们经常这样写:

btShowDialog = (Button) findViewById(R.id.bt_showdialog);
btShowDialog.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // do something
    }
});

我们经常可以看到这样类似的代码,监听一个按钮的点击事件,当用户点击之后,我们执行一些逻辑。

这里的 setOnClickListener() 就跟我们之前店员获得我的电话号码的方法一样 setNumber() 注册好事件。
源码:

/**
 * Register a callback to be invoked when this view is clicked. If this view is not
 * clickable, it becomes clickable.
 *
 * @param l The callback that will run
 *
 * @see #setClickable(boolean)
 */
public void setOnClickListener(@Nullable OnClickListener l) {
    if (!isClickable()) {
        setClickable(true);
    }
    getListenerInfo().mOnClickListener = l;
}

/**
 * Interface definition for a callback to be invoked when a view is clicked.
 */
public interface OnClickListener {
    /**
     * Called when a view has been clicked.
     *
     * @param v The view that was clicked.
     */
    void onClick(View v);
}

到这里的时候是不是就很清晰了呢?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65058.html

相关文章

  • Part1程序设计基础Java语言程序设计(10th))

    摘要:缘起这是语言程序设计的,计划之前全部整理完。产生随机数的方法。复习题双分支语句复习题嵌套的语句和多分支语句复习题常见错误和陷阱常见错误两个浮点数值的相等测试复习题产生随机数产生一个到之间的随机值,不包括。 缘起 这是《Java语言程序设计(10th)》的Part1,计划2017-12-31之前全部整理完。 2017-12-23开始想看这本书的,并同时开始实践起Java来的。 Part...

    BDEEFE 评论0 收藏0
  • js css 基础知识点和面试题复习

    摘要:两种元素必须拥有相同的父元素,但是不必直接紧随。临时移动重定向未修改访问缓存数据客户端错误,请求包含语法错误或无法完成请求身份为认证服务器错误,服务器在处理请求的过程中发生了错误服务器内部错误持续更新 对平常的小知识点,会持续更新 == 对比 特殊原则 undefined == null / null == undefined number 和 string/boolean 对比将...

    yeooo 评论0 收藏0
  • 跳槽季如何快速全面复习面试题

    摘要:排序算法和集合工具类排序算法和集合工具类。面试官总是问排序算法也不是在难为你,而是在考察你的编程功底。你首先要理解多线程不仅仅是和那么简单,整个并发包下面的工具都是在为多线程服务。 去年的这个时候楼主通过两个月的复习拿到了阿里巴巴的 offer,有一些运气,也有一些心得,借着跳槽季来临特此分享出来。简单梳理一下我的复习思路,同时也希望和大家一起交流讨论,一起学习,如果不对之处欢迎指正一...

    keke 评论0 收藏0
  • 我的2016年Java书单

    摘要:相对于电子书,我更喜欢纸质版的书籍。过去的年一共阅读过本技术书,下面对这些书做一个小结。源码深度解析这本书是年购买的,年是第四次阅读。必知必会数据库的复习书籍,内容浅显易懂。 相对于电子书,我更喜欢纸质版的书籍。我喜欢在拿到新书时记录购买时间、地点、开始阅读的时间、第一次看完的时间,算是一种学习的记录。过去的2016年一共阅读过15本技术书,下面对这些书做一个小结。 《深入理解Java...

    Scholer 评论0 收藏0
  • Java 学习路线之四个阶段

    摘要:写这篇总结,主要是记录下自己的学习经历,算是自己对知识的一个回顾。这个阶段学习的时候,要学会使用开发工具,比如或者来学习。这个阶段需要自己对自己有很强的自律去学习,不要看了一半就放弃了。 showImg(https://segmentfault.com/img/bVbaNtw?w=1232&h=822); 写这篇总结,主要是记录下自己的学习经历,算是自己对知识的一个回顾。也给想要学习 ...

    fredshare 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<