`
蓝月儿
  • 浏览: 50014 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

android的回调机制(转自http://www.cnblogs.com/vtianyun/archive/2012/06/19/2555427.html)

阅读更多
一、回调函数
  回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
详细解释:
  客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web Service以及Java的RMI都用到回调机制,可以访问远程服务器程序。
下面举个通俗的例子:
  某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
  JAVA中不允许直接操作指针,那它的回调是如何实现的呢?
  答案:它是通过接口或者内部类来实现的。
  JAVA方法回调是功能定义和功能实现分享的一种手段,是一种耦合设计思想。作为一种架构,必须有自己的运行环境,并且提供用户的实现接口。
  1. 定义接口 Callback ,包含回调方法 callback()
  2. 在一个类Caller 中声明一个Callback接口对象 mCallback
  3. 在程序中赋予 Caller对象的接口成员(mCallback) 一个内部类对象如
  new Callback(){
    callback(){
      //函数的具体实现
    }
  }
  这样,在需要的时候,可用Caller对象的mCallback接口成员 调用callback()方法,完成回调.。

二、回调机制在Android框架中的使用
  这里有几个例子:
  1、在Activity中定义了很多生命周期的不同状态要调用的方法,这些方法都是空实现,系统框架要调用,用户也要调用来实现。
    实例(对于Android界面上Button点击事件监听的模拟):
    a.定义接口
    public interface OnClickListener {
      public void OnClick(Button b);
    b. 定义Button
     public class Button {
      OnClickListener listener;
      public void click() {
        listener.OnClick(this);
      }
      public void setOnClickListener(OnClickListener listener) {
        this.listener = listener;
      }
     }
    c. 将接口对象OnClickListener 赋给 Button的接口成员
    public class Activity {
      public Activity() {
      }
      public static void main(String[] args) {
        Button button = new Button();
        button.setOnClickListener(new OnClickListener(){
          @Override
          public void OnClick(Button b) {
            System.out.println("clicked");
          }
        });
        button.click(); //user click,System call button.click();
      }
    }
  2、在Activity中定义了很多生命周期的不同状态要调用的方法,这些方法都是空实现,系统框架要调用,用户也要调用来实现。
    实例(对于Android界面上Activity的模拟):
    a.定义接口
    public interface Activity{
      public void onCreate();
      .....
      public void onDestory();
    }
    b. Activity接口的实现类MyActivity
    //定义一个类实现Activity接口
    public calss MyActivity implements Activity{
      @Override//实现方法,简单输出
      public void onCreate(){
        System.out.println("onCereate");
      }
      .....
      @Override//实现方法,简单输出
      public void onDestory(){
        System.out.println("onDestory");
      }
    }
    c.系统运行环境类AndroidSystem
    //系统运行安装类
    public class AndroidSystem{
      //定义常量

      public static final int CREATE=1;
       ....
      public static final int DESTORY=2;
      //运行方法
      public void run(Activity a,int state){
        switch(state){
        case CREATE:
          a.onCreate;
          break;
        ....
        case DESTORY:
          a.onDestory();
          break;
        }
      }
    }
    d.测试类
     //测试类
     publilc class Test{
      public static void main(String[] args){
        //实例化AndroidSystem
        AndroidSystem system = new AndroidSystem();
        //实例化MyActivity
        Activity a = new MyActivity();
        system.run(a,AndroidSystem.CREAATE);
        ....
        system.run(a,AndroidSystem.DESTORY);
      }
    }
  以上可以看出,接口(系统框架)是系统提供的,接口的实现是用户实现的,这样可以达到接口统一,实现不同的效果。
  系统在不同的状态“回调”我们的实现类,来达到接口和实现的分类。
转自http://www.cnblogs.com/vtianyun/archive/2012/06/19/2555427.html
分享到:
评论

相关推荐

    android IM

    http://www.cnblogs.com/not-code/archive/2011/07/16/2108369.html 成功解决asmack不能收发文件的问题 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=81207 asmack :...

    sso详细设计说明书(下篇)转载(海纳百川文章http://www.cnblogs.com/David-weihw/a)

    SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在多个应用系统中只需登录一次,即可访问所有相互信任的应用系统,无需再次进行身份验证。本详细设计说明书的下篇将深入探讨SSO的核心原理、实现方式及...

    23种设计模式的java实现

    解释器模式 http://www.cnblogs.com/java-my-life/archive/2012/06/19/2552617.html 迭代模式 http://www.cnblogs.com/java-my-life/archive/2012/05/22/2511506.html 中介者模式 ...

    HSQLDB安装与使用-转自http://www.cnblogs.com/wllyy189/archive/2008/11/15/1334002.html

    **HSQLDB简介** HSQLDB(HyperSQL Database)是一个开源、轻量级、高性能的关系型数据库管理系统,适用于Java应用程序。它支持嵌入式模式、服务器模式和混合模式,可以作为独立的数据库服务器运行,也可以作为Java...

    webApi请求插件PostMan

    webApi请求插件PostMan,请参考博客:http://www.cnblogs.com/chenwolong/p/PostMan.html。webApi请求插件PostMan,请参考博客:http://www.cnblogs.com/chenwolong/p/PostMan.html。webApi请求插件PostMan,请参考博客...

    .net C# 学习过程中收藏的一些比较有用的和感兴趣的链接

    http://www.360doc.com/userhome.aspx?userid=19107491&cid=3 jQuery基本选择器及用法 前端模块化开发(AMD和CDM规范) ...http://www.cnblogs.com/dwlsxj/p/4052871.html 浅析MSIL中间语言——PE文件结构篇

    Web 断点续传批量上传上传工具

    开发文档-ASP.NET:http://www.cnblogs.com/xproer/archive/2012/02/17/2355469.html 升级日志:http://www.cnblogs.com/xproer/archive/2012/02/17/2355449.html 示例下载:...

    根据本地浏览器的版本自动更新chromedriver 自适应114版本以前的版本,也适应之后的版本115、116、117、118

    https://www.cnblogs.com/interdrp/p/17650069.html 在此提交bug 有需要的自行下载 https://sms.reyo.cn/test/v2.zip 2023-08-24 已更新自适应版本下载,不再需要配置不同版本的ini文件了,请保持对应关系即可!!!...

    C# 并发测试

    存储过程版、EF框架版,详情请结合博客:http://www.cnblogs.com/chenwolong/p/BF.html 网址。 C#并发处理。存储过程版、EF框架版,详情请结合博客:http://www.cnblogs.com/chenwolong/p/BF.html 网址。 C#并发...

    C# 简单的作业调度

    ,C# 简单的作业调度,亦可参考博客:http://www.cnblogs.com/chenwolong/p/Job.html,C# 简单的作业调度,亦可参考博客:http://www.cnblogs.com/chenwolong/p/Job.html,C# 简单的作业调度,亦可参考博客:...

    谷歌开源的Google Preview Image Extractor.zip

    这个项目可以考虑用在特定情况下加速加载无损格式的预览图,提升用户体验 该项目没有demo代码,demo代码可参考博客园的一位网友的文章:http://www.cnblogs.com/tntmonks/p/5143350.html 标签:无损图片

    一个牛人提供的GIS源码(很好)

    MapBar中坐标的加密和解密(JS实现) http://www.cnblogs.com/Tangf/archive/2006/06/06/419124.html 发现一个SVG做的地图网站:ChinaQuest http://www.cnblogs.com/Tangf/archive/2006/06/04/417110.html boot.ini...

    Android代码-SmartPopupWindow

    不得不吐槽的Android PopupWindow的几个痛点(实现带箭头的上下文菜单遇到的坑)博文地址:http://www.cnblogs.com/popfisher/p/5944054.html Android7.0 PopupWindow的兼容问题,修复了问题1和3中描述的问题,...

    django项目实例(django 简易博客开发)

    http://www.cnblogs.com/cacique/archive/2012/09/29/2707976.html django 简易博客开发 2 模板和数据查询 http://www.cnblogs.com/cacique/archive/2012/09/30/2709143.html django 简易博客开发 3 静态文件、...

    集XMPP推送与聊天于一体的Openfire开发Android

    与标题一致的描叙,你值得拥有,确实很值。...http://www.cnblogs.com/not-code/archive/2011/08/01/2124340.html http://android-zhang.iteye.com/blog/1836312 http://www.2cto.com/kf/201303/199088.html ...

    MVC5&EF6入门教程_Part3

    转自:http://www.cnblogs.com/miro/p/4030622.html 整理到了doc文档里,内含代码。 方便一起学习。

    JS截屏控件

    开发文档-ASP.NET(C#):http://www.cnblogs.com/xproer/archive/2010/12/04/1896552.html 开发文档-PHP:http://www.cnblogs.com/xproer/archive/2011/05/16/2047915.html 开发文档-JSP:...

    bndong https://bndong.github.io/Cnblogs-Theme-SimpleMemory/v2/#/

    bndong https://bndong.github.io/Cnblogs-Theme-SimpleMemory/v2/#/

    dhtmlxScheduler_v36_std_121203下载地址

    http://www.cnblogs.com/xuqiang/archive/2010/11/02/1953419.html http://ynial.iteye.com/blog/741092 http://www.oschina.net/p/dhtmlxscheduler/news http://www.fanganwang.com/Product-detail-item-1447.html ...

Global site tag (gtag.js) - Google Analytics