平时在写程序时经常会遇到监听器,比如按钮的click监听器,按键监听器等等。而android中的监听器和java中的回调函数是同一个概念,都是在底层代码中定义一个接口来调用高层的代码。那么什么是回调函数呢?网上说的是“在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就称为回调。在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃。这样的解释似乎还是比较难懂,这里举个简单的例子,程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。”按照我的理解就是在程序A中先挖了一个坑,然后等着你在程序B中去填里面的内容。不填?那就是被坑咯~

一、定义回调函数

  1. 建立一个类,其中包括一个接口的变量

    private CallBack callBack;//接口的变量

  2. 建立一个接口的声明
    public interface CallBack{public void Out();//接口里面要实现的方法
    }

  3. 在类中与接口绑定(或者说获得接口的引用)
    public void setCallBack(CallBack callBack){this.callBack = callBack;}public void Out(){callBack.Out();System.out.println("这是CallerClass的输出");}

  4. 整个类

    public class CallerClass {private CallBack callBack;//接口的声明public CallerClass(){};public void setCallBack(CallBack callBack){this.callBack = callBack;}public void Out(){callBack.Out();System.out.println("这是CallerClass的输出");}public interface CallBack{public void Out();//接口里面要实现的方法}}

二、调用回调函数

我这里是在Activity中绑定接口,实际代码如下:

public class MainActivity extends Activity implements CallerClass.CallBack{  private CallerClass caller; ...}

继承了CallerClass中的CallBack接口,Out方法如下:

    @Overridepublic void Out() {// TODO Auto-generated method stubSystem.out.println("这是Activity上的输出");}

最后在onCreate中调用CallerClass的Out()方法:

caller = new CallerClass();
caller.setCallBack(this);
caller.Out();

完整代码:

public class MainActivity extends Activity implements CallerClass.CallBack{private CallerClass caller;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);caller = new CallerClass();caller.setCallBack(this);caller.Out();}@Overridepublic void Out() {// TODO Auto-generated method stubSystem.out.println("这是Activity上的输出");}}

三、结果

Perfect~

interface的作用感觉和C++中的指针差不多,它是一个地址的引用,但没有生成内存。所以我们能够预先为程序赋予要执行的方法。不止如此,interface在设计模式的作用更是强大,工厂模式,建造者模式,观察者模式无不用到interface。

为你的程序添加监听器相关推荐

  1. 给你的Flex程序添加深链接和分析-其实比你想象的要简单

    Adobe Flash Builder 4 简体中文正式版 Windows版点击下载:http://g.csdn.net/5134151 Adobe Flash Builder 4 简体中文正式版 M ...

  2. java中两种添加监听器的策略

    /*第一种:将事件的处理委托给其他对象,下面的例子是委托给了MyListener(implements ActionListener)*/ 1 import java.applet.Applet; 2 ...

  3. QT修改应用图标,给按钮添加监听器

    1.QT怎么修改应用图标 将图标文件放到工程下面,例如qwind_icon.ico 然后在项目中点击右键,选择添加新文件 在新建文件对话框中选择Qt->Qt Resource File 在弹出的 ...

  4. linux下 为自己编写的程序 添加tab自动补全 功能

    linux下 为自己编写的程序 添加tab自动补全功能 入门 complete 在我的tmp下随便写了一个a.sh, 为他补全 edit /etc/bash_completion.d/foo _foo ...

  5. firebase 推送_如何使用Firebase向Web应用程序添加推送通知?

    firebase 推送 by Leonardo Cardoso 由莱昂纳多·卡多佐(Leonardo Cardoso) 如何使用Firebase向Web应用程序添加推送通知? (How to add ...

  6. 为.NET部署应用程序添加个卸载程序

    地球人都知道.NET自带的部署程序用起来很方便很简单,但.NET部署程序是没有卸载文件. 下面的方法可以很简单的为你的程序添加1个卸载文件,.NET是利用windows Installer来部署程序的 ...

  7. 关于把程序添加到打开方式的解决办法

    对于如果想用其他某个程序打开某种文件,找到程序在点击确定之后,回到打开方式对话框中,里面没有你刚才选择的程序,无法将你要的程序添加到打开方式里面,只能自己单独×××该程序,在程序里面再打开你要用的文件 ...

  8. 【OpenGL】二十四、OpenGL 纹理贴图 ( 读取文件内容 | 桌面程序添加控制台窗口 | ‘fopen‘: This function may be unsafe 错误处理 )

    文章目录 一.文件读取 二.报错处理 ( 'fopen': This function or variable may be unsafe. ) 三.桌面程序添加控制台窗口 四.相关资源 一.文件读取 ...

  9. 为ios 应用程序添加图标和添加名字

    为应用程序添加图标方法: 1.找到ios工程文件对应的 ***.plist文件.查看是否有 iconfile 或者iconfiles 键值,如果有,请看下一步.如果没有,则随便选中一个键值,然后点击 ...

最新文章

  1. 【STM32】FreeRTOS 系统内核控制函数
  2. 编写Play 2的模块,第2部分:拦截器
  3. 每天进步一点点《SVD学习》
  4. 修改CentOS系统的默认启动级别
  5. Oracle环境变量
  6. Deep Learning for Content-Based Image Retrival:A Comprehensive Study 论文笔记
  7. javaWeb上传文件(jsp上传文件)
  8. ps安装失败的快速解决方法
  9. ISO镜像安装WIN10到NVME固态硬盘,无法找到新加装的NVME硬盘(驱动器)
  10. CAD打印adobe acrobat pro/DC 安装的PDF打印机闪退问题
  11. 微信公众号菜单模板设置
  12. hadoop学习路线
  13. 医学人工智能读书会与黄智生教授简历(公号回复“医学AI读书会”下载PDF资料,欢迎转发、赞赏、支持科普)
  14. 梦三花重金修改服务器,3月6日一梦江湖游戏更新公告
  15. 金蝶KIS标准迷你版专业版 K3 引出报表提示保存文件失败,原因:Automation错误
  16. fatal: unsafe repository is owned by someone else 的解决方法
  17. web实现置顶、置底功能、聊天页面、锚点、滚动条、vue、scrollTop、scrollIntoView、scrollHeight
  18. C++捕获全屏(截全屏)
  19. Python学习,用python制作字符版gif图
  20. 南京航空航天大学矩阵论答案

热门文章

  1. GPUImage源码解读之GPUImageFramebuffer
  2. docker进阶-搭建私有企业级镜像仓库Harbor
  3. 2.Linux技能要求
  4. atcode062D(预处理&优先队列)
  5. hdu 3863 No Gambling (不会证明,但是是对的,,)
  6. jQuery--.css(width)和.width()的区别
  7. 搭建电商平台的标签系统?看这就够了
  8. 美团悄悄进入企业早餐,其战略目的为高频带低频?
  9. 浅析Unity中的Enlighten与混合光照
  10. 性能分布式NewLife.XCode对无限数据的支持