Android回调解惑

对于Android的回调,我相信凡是只要是开发过Android的,必然会碰到。但是我想大家对于这个名词都会是一个慢慢理解的过程,我也是一样,一开始肯定是迷茫的,特别是小白。

经过实践的洗礼,一遍一遍的cv,到后来自己慢慢深入理解,最后终于理解了这个过程。就是一个门外门里的感觉,一旦真正理解了,就会觉得非常简单,迷茫到解惑其实只是一步之遥,就看你能否跨过。这个道理也不仅局限于此,时间万物也都是如此,只要不畏惧,你就能把他拿下。

我想此事在看的读者,也肯定查看过很多的资料。一般都会看到一个对回调的比喻:

我打电话给小明,有一个问题想问他,但是接通后,他说现在很忙,需要处理完事后再帮你解决这个问题,最后会打电话到诉我答案。

如我我在什么都不懂的情况下,看到这个比如是懵逼的。但我们还是要硬着头皮去慢慢理解,我相信最后将是取得成功的。

话不多说,那我们就以此为例子,通过代码的方式,还原回调的过程。

首先是最最最重要的代码,是回调的精华所在,即定义一个接口,此接口的作用我先说下:就是作为一个动作的回拨,下面会介绍到

package com.pyj.myapplication.huidiao;

/**
 * 作为一个回拨的作用
 *
 * @author: 流冥
 * @date: 2017-08-02 16:12
 */
public interface IAsk {

    //告知答案
    void tellAnswer(String answer);

}
接下来是小明粉墨登场

package com.pyj.myapplication.huidiao;

/**
 * 小明的一系列行为操作
 *
 * @author: 流冥
 * @date: 2017-08-02 16:25
 */
public class Xiaoming {
    IAsk iAsk;
    String question;//问题
    String answer;//答案

    public Xiaoming(IAsk iAsk) {
        this.iAsk = iAsk;
    }

    //联系小明的方式,通过电话的方式找到小明,并且问出一个问题
    public void callMe(String question) {
        this.question = question;
        System.out.println(question);
    }

    //小明在外面办事,暂时没时间
    public void doSomeThing() {
        for (int i = 0; i < 3; i++)
            System.out.println("小明在办第" + i + "件事");
        System.out.println("小明处理完自己的事");
        
    }

    //小明对于这个问题的思考并且想到了答案
    public void thinkQuestionAndGetAnswer() {
        System.out.println("小明开始思考-----" + question + "------这个问题");
        answer = "2";
        System.out.println("小明想到答案是----" + answer);
    }

    //小明想通了这个问题,并联系到我把答案告诉了我
    public void callPeoson() {
        iAsk.tellAnswer("小流,答案是" + answer + ",这么简单的都不会,你自己要好好反思了哦!");
    }


}


接下来是整个场景,以我为第一个人称开始的表演:

package com.pyj.myapplication.huidiao;

/**
 * 场景再现
 *
 * @author: 流冥
 * @date: 2017-08-02 16:15
 */
public class CallBackTest {
    //这个场景是站在我的立场上,小明是第二人称
    public static void main(String[] args) {
        //这里的IAsk,就像是我的手机号码一样,当小明想到答案了,就会通过iAsk这个对象来联系我,并把答案告诉我
        Xiaoming xiaoming = new Xiaoming(new IAsk() {//找到小明,并告诉他我的联系方式,回头想到了答案可以联系我
            @Override
            public void tellAnswer(String answer) {
                System.out.println(answer);
            }
        });
        xiaoming.callMe("小明,我有个问题要问你,1+1等于多少?");//打电话给小明,问他问题
        xiaoming.doSomeThing();//小明有事,先做完他自己的事
        xiaoming.thinkQuestionAndGetAnswer();//小明做完自己的事后,开始思考问题并最终想到答案
        xiaoming.callPeoson();//小明通过我之前留给他的联系方式,告诉我他得到的答案,并劝诫我要好好学习了
    }


}

回调,顾名思义,有来有回,大家记住,来而不往非礼也,此时,我觉得对于回调来说无比贴切。

接下来开始慢慢分析:

	Xiaoming xiaoming = new Xiaoming(new IAsk() {//找到小明,并告诉他我的联系方式,回头想到了答案可以联系我
            @Override
            public void tellAnswer(String answer) {
                System.out.println(answer);
            }
        });


一开始我new了小明一个对象,并把IAsk这个参数传给了小明。我们用情景的方式来描述的话,就是:此时此刻,我打电话找打了小明,并告知他我的联系方式(即IAsk),这一步其实也是最重要的一步,这里已经有2个大人物出现了,小明和我的联系方式(IAsk),这2个就像是动漫里经常提到的羁绊,相互关联着。有了这层联系,后面发生的一系列事才会得到答案。

 	xiaoming.callMe("小明,我有个问题要问你,1+1等于多少?");//打电话给小明,问他问题
        xiaoming.doSomeThing();//小明有事,先做完他自己的事
        xiaoming.thinkQuestionAndGetAnswer();//小明做完自己的事后,开始思考问题并最终想到答案
这些就是我在打通小明后,小明做的一系列的事,显示干完自己的事,然后思考我的问题并相处答案。像这样的场景,在写代码的过程中很多,

比方在receyleView的适配器中,先让其展示,当用户点击某个item的时候,触发点击事件,回传到activity并把点击的信息一并传递过去;

又或者最经典的button点击事件,我先放一个按钮,我不知道按钮什么时候会被点击,但是我知道一定是用户点击的时候,点击事件才会发生,此时我们建立一个回调,等用户点击的时候返回给我点击信息。

就如同小明想到答案了再打电话告诉我一般。这样一来,是否会更好理解了呢。

最后,就是小明回拨电话给我了

xiaoming.callPeoson();//小明通过我之前留给他的联系方式,告诉我他得到的答案,并劝诫我要好好学习了
这个操作一旦完成,在IAsk里的tellAnswer(String answer)方法就会接收到小明给我的答案了。

最后打印下整个日志

小明,我有个问题要问你,1+1等于多少?
小明在办第0件事
小明在办第1件事
小明在办第2件事
小明处理完自己的事
小明开始思考-----小明,我有个问题要问你,1+1等于多少?------这个问题
小明想到答案是----2
小流,答案是2,这么简单的都不会,你自己要好好反思了哦!


如果有小伙伴不明白为什么xiaoming.callPeoson()这个方法一执行tellAnswerString answer)这个方法就会被调用的话,你就要好好理解下java的interface和实现过程。

其实也是很简单的,

Xiaoming xiaoming = new Xiaoming(new IAsk() {//找到小明,并告诉他我的联系方式,回头想到了答案可以联系我
            @Override
            public void tellAnswer(String answer) {
                System.out.println(answer);
            }
        });

我们在xiaoming的构造函数中传递了一个IAsk的实现类,就说明xiaoming已经拥有这个实现类的对象,之后,只要只要调用这个实现类的方法,这个方法就必然会执行。

其实这也就是java的多态性而已,不懂的要去好好理解下多态的概念吧





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值