对于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 xiaoming = new Xiaoming(new IAsk() {//找到小明,并告诉他我的联系方式,回头想到了答案可以联系我
@Override
public void tellAnswer(String answer) {
System.out.println(answer);
}
});
我们在xiaoming的构造函数中传递了一个IAsk的实现类,就说明xiaoming已经拥有这个实现类的对象,之后,只要只要调用这个实现类的方法,这个方法就必然会执行。
其实这也就是java的多态性而已,不懂的要去好好理解下多态的概念吧