CallBack是回调的意思,熟悉Windows编程的人对"回调函数"这四个字一定不会陌生,但是Java程序员对它可能就不太了解了。"回调函数"或者"回调方法"是软件设计与开发中一个非常重要的概念,掌握"回调函数"的思想对程序员来说(不管用哪种语言)是非常必要的。

  那么什么是回调函数呢?我认为,回调函数就是预留给系统调用的函数,而且我们往往知道该函数被调用的时机。这里有两点需要注意:第一点,我们写回调函数不是给自己调用的,而是准备给系统在将来某一时刻调用的;第二点,我们应该知道系统在什么情形下会调用我们写的回调函数。

  这里举个现实生活中"回调函数"的例子来帮助大家更好的理解。我们平时考试答题的第一件事是干嘛?没错,是写上学号和姓名。这里注意了,我们填写学号和姓名不是给自己看的(即该方法不是给自己调用的),而是给老师登记分数时看的(预留给系统将来调用),这其实就是一个回调的应用。

  下面再来看一下Android中应用到"回调"的场景。

  场景一:

Button button = (Button)this.findViewById(R.id.button);button.setOnClickListener(new Button.OnClickListener() {

//回调函数  @overridepublicvoid onClick(View v) {    buttonTextView.setText("按钮被点击了");  }});

  上面的代码给按钮加了一个事件监听器,这其实就是"回调"最常见的应用场景之一。我们自己不会显示地去调用onClick方法。用户触发了该按钮的点击事件后,它会由Android系统来自动调用。

  场景二:

@Overridepublicvoid onCreate(Bundle saveInstanceState) {super.onCreate(saveInstanceState);// You code...}

@Overridepublicvoid onResume() {super.onResume();// You code...}

  上面的方法大家就更熟悉了,这是Android系统在Activity类中设置的回调函数,在Activity生命周期的不同阶段,Android系统会自动调用相应的方法(onCreate, onPause, onResume,onDestroy等等)

  以上是两个Android中用到"回调"的场景,他们的代码实现可能不同,但是思想上是相近的,都是"回调"思想的体现。下面,我们在Java中分别模拟这两个场景。

  首先模拟注册事件监听器。先写一个监听器接口

package com.listener;

/** * 点击监听器接口 * @author CodingMyWorld **/publicinterface MyOnClickListener {publicvoid onClick();}

  然后写一个我们自己的Button类

package com.listener;

publicclass MyButton {private MyOnClickListener listener;

/**     * 设置具体点击监听器     * @param listener 点击监听器实现类*/publicvoid setOnClickListener(MyOnClickListener listener) {this.listener = listener;    }

/**     * 按钮被点击*/publicvoid doClick() {        listener.onClick();    }}

  最后模拟Client端的注册监听器和触发点击操作。

package com.listener;

publicclass Client {publicstaticvoid main(String[] args) {        MyButton button =new MyButton();//注册监听器        button.setOnClickListener(new MyOnClickListener() {

            @Overridepublicvoid onClick() {                System.out.println("按钮被点击了");

            }

        });//模拟用户点击        button.doClick();    }}

  以上就是"回调"思想在Java中事件监听的运用,我们再模拟第二个场景,"回调"在activity生命周期方法调用的体现。由于比较简单,我就不多做解释了,大家直接看代码。

package com.activity;

publicabstractclass Activity {protectedvoid onCreate() {        System.out.println("创建准备~~~~~~~");    }

protectedvoid onDestroy() {        System.out.println("销毁准备~~~~~~~~");    }}

package com.activity;

publicclass ConcreteActivity extends Activity {    @Overrideprotectedvoid onCreate() {super.onCreate();        System.out.println("创建中!!!");    }

    @Overrideprotectedvoid onDestroy() {super.onDestroy();        System.out.println("销毁中!!!");    }}

package com.activity;

publicclass Client {publicstaticvoid main(String[] args) {        Activity activity =new ConcreteActivity();        activity.onCreate();        activity.onDestroy();    }}

  OK,我对CallBack的理解就谈到这,有不对和能改进的地方也希望大家指正,多多交流。

转载于:https://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html

谈谈我对Java中CallBack的理解相关推荐

  1. 【转载】谈谈我对Java中CallBack的理解

    谈谈我对Java中CallBack的理解 转载自: http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html CallB ...

  2. 谈谈对java中分层的理解_让我们谈谈网页设计中的卡片设计

    谈谈对java中分层的理解 "I want a card", this is the first demand point that the customer said in th ...

  3. 谈谈你对Java异常处理机制的理解

    谈谈你对Java异常处理机制的理解 先谈谈我的理解:异常处理机制可以说是让我们编写的程序运行起来更加的健壮,无论是在程序调试.运行期间发生的异常情况的捕获,都提供的有效的补救动作,任何业务逻辑都会存在 ...

  4. Java中 多态的理解

    ** Java中 多态的理解 ** 多态官方定义为: 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指 ...

  5. 沉淀再出发:关于java中的AQS理解

    沉淀再出发:关于java中的AQS理解 一.前言 在java中有很多锁结构都继承自AQS(AbstractQueuedSynchronizer)这个抽象类如果我们仔细了解可以发现AQS的作用是非常大的 ...

  6. JAVA中多态的理解

    Java中多态的理解 JAVA中的多态可以简单的理解为一种事物的多种形态,当然多态是在继承的基础上有重写才存在. 标题如何理解一种事物的多种形态? 举个例子,拿人类.男人.女人来说.男人.女人.都分别 ...

  7. Java中Volatile的理解

    首先我们知道Java中的内存模型 即:线程工作内存--主内存 工作内存是线程私有的,主内存是线程共有的 变量的初始化,生成都在主内存,工作内存只有使用到该变量时才从主内存加载操作 共八中原子性操作,r ...

  8. java中equals的理解(1)

    在Java字符串那些事儿一文发表后,朋友给我留言说:比较字符串用equals不就完了呗,干嘛要用"==",吃饱了撑的,能不能来点实际的.其实在文章里我是想表明,Java字符串两种声 ...

  9. java中resulttype,深入理解Mybatis中的resultType和resultMap

    一.概述 MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部Re ...

最新文章

  1. pandas.read_csv(path_features_known_csv, header=None)的用法
  2. Asp.NET 中 Ajax 的配置使用
  3. 计算时间差的Oracle函数
  4. php中文件下载,PHP中文件下载
  5. 【Git笔记3】关于撤销、删除、恢复的那些事儿
  6. 安装fastdfs依赖包
  7. linux c 读写mbr_Linux系统启动那点事
  8. 正交匹配追踪算法(OMP)简介与详解
  9. Codeforces Round #393 (Div. 2) - B. Frodo and pillows(模拟)
  10. OA实施成功的几个必备条件
  11. ClassCastException: XXX are in unnamed module of loader ‘app‘异常分析
  12. 戴尔笔记本DELL 5557 解锁 CFG lock
  13. 千兆12光12电工业级环网交换机24口全千兆二层网管型机架式工业以太网交换机
  14. HA状态下防火墙损坏处理
  15. html边框闪烁代码,纯css实现动态边框的示例代码
  16. 天池竞赛员工离职预测训练赛
  17. 【Cucumber系列】Cucumber Hooks
  18. 外卖cps淘宝客如何实现用户与订单的绑定(附外卖cps带分销返利源码)
  19. XLNet:Generalized Autoregressive Pretraining for Language Understanding(2019-6-19)
  20. 自定义menu菜单布局

热门文章

  1. vs2015 linux jni,使用Visual C++ 跨平台移动技术调试JNI Android 应用程序
  2. Qt 信号量 QSemaphore Class 的翻译
  3. [JOI2012春季合宿]Constellation (凸包)
  4. BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)
  5. 火箭轨道计算属于什么计算机技术,2018年计算机二级高级Office每日一练 2月27日...
  6. 自编码的matlab代码,深度学习自动编码机MATLAB实现
  7. java 反射 单列_轻松掌握Java单例模式
  8. 个人作业——软件工程实践总结
  9. 标识位:可以用以确定鼠标点击的是哪一个按钮或者是文本框
  10. [Trie] Luogu P2580 于是他错误的点名开始了