不如自己写一个东西,回头自己看着舒服

回调函数:定义自己百度

干嘛的?

场景就是事务A执行一个函数时,函数内部调用了事务B中的一个方法,且接下来事务A的继续要依赖于B的方法的结果返回。

FUCK,绕不绕?!网上一搜一大把这种说辞的。我也觉得绕。

我来个通俗易懂的。

热恋中的男女,晚上吃完饭看完电影要各回各家各找各妈的时候。

男孩说,虽然我们没能去啪啪啪,但是你到家了要告诉我一声,我给你提个要求,就是到家后通知我一声就好,我好安心睡觉。

场景描述完毕,现在抽象数据模型。

这就是回调的使用,男孩要知道女孩回家的状态,但是女孩什么时候才能到家,是否安全到家他都不知道也没办法掌控,但是他和女孩说好了一个约定,就是到家后给我一个结果就好了。

什么狗屁的所谓的回调,不如说对某事件的状态监听,想要监听谁就给谁安插一个监听器进去,监听器是干啥的那就看要看主动监听的对象的意思了。

上面这个场景就是男生要监听女孩回家的状态,再通俗一点就是我是男生,我给女孩一个手机,到家了给我用这个手机联系我,是发信息还是打电话那就看我这个手机支持什么具体操作了。

那么最后抽象出来的模型就是

1男孩  class Boy

2女孩  class Girl

3手机  监听器  回调函数,继续抽象就是一个接口interface PhoneCallBackListener,回调函数总是要做点事情的嘛。

好了,下面我们就要实现代码了,没有从浅到深的啰嗦,直接用项目中实际的操作展示。

1),首先我们定义接口,回家有很多中状态,就好比项目中业务是实现结果有成功失败和超时等

回家有安全到家   危险状态  又出去high三个状态

  1. public interface PhoneCallBackListener {
  2. public void onSafe(String info);
  3. public void onDanger(String info);
  4. public void onGoOut(String info);
  5. }

监听器(手机)有三个方法,到家的状态认为有三种,哪个发生了执行哪个回调

2),男孩要对女孩进行监听,怎么监听男孩说的算,所以接口要由男孩实现,这个逻辑很好理解。

  1. public class Boy implements PhoneCallBackListener{
  2.  
  3. public Boy(){
  4. System.out.println("创建一个男孩");
  5. }
  6.  
  7. @Override
  8. public void onSafe(String info) {
  9. // TODO Auto-generated method stub
  10. System.out.println("Boy类中的接口实现:女孩告诉我》"+info);
  11. }
  12.  
  13. @Override
  14. public void onDanger(String info) {
  15. // TODO Auto-generated method stub
  16. System.out.println("Boy类中的接口实现::女孩告诉我》"+info);
  17. }
  18.  
  19. @Override
  20. public void onGoOut(String info) {
  21. // TODO Auto-generated method stub
  22. System.out.println("Boy类中的接口实现::女孩告诉我》"+info);
  23. }
  24.  
  25. }

3)接下来创建一个女孩,女孩也同意男孩要求,说我听你的,到家了跟你说一声。 所以女孩要有能拿电话的能力

  1. public class Girl{
  2.  
  3. public Girl(){
  4. System.out.println("创建一个女孩");
  5. }
  6.  
  7. //女孩要有拿电话的能力(能够接受男孩给的电话)
  8. private PhoneCallBackListener phone;
  9.  
  10. void setPhoneCallBackListener(PhoneCallBackListener phone){
  11. if(phone != null){
  12. System.out.println("我是女孩,我接受了男孩给我的电话");
  13. this.phone = phone;
  14. }
  15. }
  16.  
  17. //女孩到家用电话告知自己的情况
  18. void callBack(int hours){
  19. if(hours>2){
  20. phone.onDanger("两个小时还没到家,有紧急情况");
  21. }else if((hours<=2) && (hours >=1)){
  22. phone.onGoOut("到家了又有事情外出一下");
  23. }else{
  24. phone.onSafe("安全到家!");
  25. }
  26. }
  27.  
  28. }

三个具体的类都抽象出来也都实现了,下面具体实测一下效果。

我实现一个面函数

  1. public class MainCallBack{
  2.  
  3. public static void main(String[] args) {
  4. Boy boy = new Boy();
  5. Girl girl = new Girl();
  6. //写法1,直接new接口
  7. System.out.println("写法1,直接new接口");
  8. girl.setPhoneCallBackListener(new PhoneCallBackListener() {
  9. @Override
  10. public void onSafe(String info) {
  11. // TODO Auto-generated method stub
  12. System.out.println("男孩让我到家后告诉他,我已安全到家");
  13. }
  14.  
  15. @Override
  16. public void onGoOut(String info) {
  17. // TODO Auto-generated method stub
  18. System.out.println("男孩让我到家后告诉他,我又出去了");
  19. }
  20.  
  21. @Override
  22. public void onDanger(String info) {
  23. // TODO Auto-generated method stub
  24. System.out.println("男孩让我到家后告诉他,我有紧急情况");
  25. }
  26. });
  27. girl.callBack(1);
  28. //写法2,将boy传进去(接口实例对象的引用)
  29. System.out.println("写法2,将boy传进去(接口实例对象的引用)");
  30. girl.setPhoneCallBackListener(boy);
  31. girl.callBack(3);
  32. System.out.println("main方法结束");
  33. }
  34. }

看输出结果

  1. 创建一个男孩
  2. 创建一个女孩
  3. 写法1,直接new接口
  4. 我是女孩,我接受了男孩给我的电话
  5. 男孩让我到家后告诉他,我又出去了
  6. 写法2,将boy传进去(接口实例对象的引用)
  7. 我是女孩,我接受了男孩给我的电话
  8. Boy类中的接口实现::女孩告诉我》两个小时还没到家,有紧急情况
  9. main方法结束

总结:想要监听谁(某事务的运行结果),就给谁安插一个监听器(接口的实例对象),在这个类中私有一个接口引用,并完成一个“set”方法赋值。当事务执行完毕,执行接口里面对应的方法(回调),就能将监听结果反馈给主动监听的对象。主动监听的对象去实现接口的方法。

boy是主动监听的对象,由boy实现接口

girl是被监听的对象,要安插一个接口的引用在里面,并在girl里完成“set”方法

girl完成自己的事情后,执行接口方法进行回调

逻辑就是这么个逻辑

本来在新浪里面写完了,但是排版实在垃圾,突然想到好像自己有个博客园的账号,还能登陆进来搬家来这边。

没有自己好好排版,先这么弄吧,博客园处女作。理解不对勿喷,请指正。

 

Android or Java的回调粗俗理解 这才是最通俗易懂的的更多相关文章

  1. [转载] 深入理解Android之Java虚拟机Dalvik

    本文转载自: http://blog.csdn.net/innost/article/details/50377905 一.背景 这个选题很大,但并不是一开始就有这么高大上的追求.最初之时,只是源于对 ...

  2. JAVA回调函数ANDROID中典型的回调地方

    在计算机中回调函数是指通过函数参数传递到其他代码类的,某一块可执行代码的引用,这以设计允许了底层代码调用者在高层定义的子程序. 在JAVA里面我们使用接口的方式来实现函数的回调. 回调的通俗就是:程序 ...

  3. Java学习之Java接口回调理解

    Java接口回调 在Java学习中有个比较重要的知识点,就是今天我们要讲的接口回调.接口回调的理解如果解释起来会比较抽象,我一般喜欢用一个或几个经典的例子来帮助加深理解. 举例:老板分派给员工做事,员 ...

  4. 深入理解Android之Java虚拟机Dalvik

    一.背景 这个选题非常大,但并非一開始就有这么高大上的追求. 最初之时,仅仅是源于对Xposed的好奇.Xposed差点儿是定制ROM的神器软件技术架构或者说方法了. 它究竟是怎么实现呢?我本意就是想 ...

  5. Android中的接口回调技术

    Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James ...

  6. 谈谈我对Java中CallBack的理解

    谈谈我对Java中CallBack的理解 http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html CallBack是回 ...

  7. 浅析android系统设计中的回调思想

    一.为何写作本文  在慢慢深入接触android开发的过程中,我越来越发现android中(至少应用曾的开发)用到了很多回调的思想.比如activity的生命周期,fragment的生命周期,皆是回调 ...

  8. [深入理解Android卷一全文-第八章]深入理解Surface系统

    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版.而知识的传播不应该由于纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容. ...

  9. [深入理解Android卷一全文-第十章]深入理解MediaScanner

    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该由于纸质媒介的问题而中断.所以我将在CSDN博客中全文转发这两本书的全部内容. ...

随机推荐

  1. golang实现权重轮询调度算法

    package main import ( "fmt" "time" ) var slaveDns = map[int]map[string]interface ...

  2. 随手一记,maven打包

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-depen ...

  3. 解决jenkins slave 中文乱码 encoding=ANSI_X3.4-1968

    jenkins配置slave进行构建时,发现slave构建的控制台输入中文乱码,查看master,slave的jenkins系统信息 file.encoding和sun.jnu.encoding都没有 ...

  4. IE浏览器下ajax和缓存的那些事儿

    项目经理最近返回了一些问题: (客户浏览器为IE11,本地360,谷歌没发现任何问题) 1.加载页面时下拉框中没有数据,关闭之后再打开出现数据: 2.数据保存之后页面没有刷新: 我也是接手别人的项目, ...

  5. 广州站长沙龙 MIP 问题及答案

    1. mip提交几个月时间了,生效量比较少,是什么原因? 答:提交 MIP 页面后,经过收录.校验.和生效三个步骤,才能在结果页看到闪电标. 1)提交 URL 后,spider 会去抓取收录: 2)页 ...

  6. 434个H5游戏源码

    各种类型HTML5游戏,界面和JS均可供项目参考 下面是下载地址

  7. MediatR 知多少

    引言 首先不用查字典了,词典查无此词.猜测是作者笔误将Mediator写成MediatR了.废话少说,转入正题. 先来简单了解下这个开源项目MediatR(作者Jimmy Bogard,也是开源项目A ...

  8. Appscan 工具快速上手教程

      1.appscan扫描 (1)白盒扫描=静态扫描,扫描源代码.(2)动态扫描=黑盒扫描,用工具来模拟黑客的攻击,查看应用层的响应.产品内部会有大量受攻击的库,当我们把一个模拟攻击发给我们的应用的时 ...

  9. 支持向量机(Support Vector Machine,SVM)—— 线性SVM

      支持向量机(Support Vector Machine,简称 SVM)于 1995 年正式发表,由于其在文本分类任务中的卓越性能,很快就成为机器学习的主流技术.尽管现在 Deep Learnin ...

  10. 彻底理解浏览器的缓存机制(http缓存机制)

    一.概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种: 同步s ...