谈谈我对Java中CallBack的理解

谈谈我对Java中CallBack的理解

http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html

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

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

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

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

  场景一:


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

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

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

  场景二:


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

@Override
publicvoid 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() {

@Override
publicvoid 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 {
@Override
protectedvoid onCreate() {
super.onCreate();
System.out.println("创建中!!!");
}

@Override
protectedvoid 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的理解就谈到这,有不对和能改进的地方也希望大家指正,多多交流。

时间: 2024-10-29 02:01:45

谈谈我对Java中CallBack的理解的相关文章

畅销书对Java中Iterator的理解误区

声明:本博客为原创博客,未经允许,不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/28110615 最近放假,闲来无事,便翻看以前看过的一些书,竟然发现有些书本(甚至是一些畅销书)对Java中Iterator有很大的误解,比如某畅销书在Collection那一章有这么一句话:"当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集

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

沉淀再出发:关于java中的AQS理解 一.前言 在java中有很多锁结构都继承自AQS(AbstractQueuedSynchronizer)这个抽象类如果我们仔细了解可以发现AQS的作用是非常大的,但是AQS的底层其实也是使用了大量的CAS,因此我们可以看到CAS的重要性了,但是CAS也是有缺陷的,但是在大部分使用的情况下,我们往往忽略了这种缺陷. 二.AQS的认识 2.1.AQS的基本概念 AQS(AbstractQueuedSynchronizer)就是抽象的队列式的同步器,AQS定义了

Java中String的理解

Java中String的理解 最近在读String的源码,看了些String的文章,自己对String作了下总结记录下来. 1.String为什么是不可变的? String是final类,不可继承,其方法也不可被覆盖,避免从子类操纵父类属性:String的值保存在private final char[]数组中,本质是一个字符数组,私有则外部不可访问和修改,final引用则引用(或说引用的值)不变.引用可以简单地认为是堆上对象的首地址.String内部的private int hash,缓存has

Java中synchronized关键字理解

好记性不如烂笔头~~ 并发编程中synchronized关键字的地位很重要,很多人都称它为重量级锁.利用synchronized实现同步的基础:Java中每一个对象都可以作为锁.具体表现为以下三种形式. (1)对于普通同步方法,锁是当前实例对象. (2)对于静态同步方法,锁是当前类的Class对象. (3)对于同步方法块,锁是synchronized括号里配置的对象. 一.普通同步方法 使用synchronized关键字修饰一个普通方法,锁住的是当前实例的对象.当synchronized锁住该对

Java中泛型的理解

Java中的泛型,本质上来说,就是是参数化类型,就是说所操作的数据类型被指定为一个参数,而不是确定的某种类型.这种数据类型可以用在类.接口和方法创建中.即泛型类.泛型接口.泛型方法.这样说可能不够生动,来举些例子说明一下. 例子一 我们通过 例子一 来简单看看泛型的应用场景.下面的情况中,没有使用泛型: public class FanXingTest { public static void main(String[] args) { ArrayList arrayList = new Arr

Java中hashcode的理解

原文链接http://blog.csdn.net/chinayuan/article/details/3345559 如何理解hashCode的作用: 以 java.lang.Object来理解,JVM每new一个Object,它都会将这个Object丢到一个Hash哈希表中去,这样的话,下次做 Object的比较或者取这个对象的时候,它会根据对象的hashcode再从Hash表中取这个对象.这样做的目的是提高取对象的效率.具体过程是这 样: 1.new Object(),JVM根据这个对象的H

Java中对象的理解

Java的核心要领就是面向对象而言,所以对于Java初学者来说,理解对象的内涵十分重要. 可以这样理解,类是汽车图纸,而对象则是汽车实体.一般来说,类中的方法是通过对象去调用,从而达到预期的效果.下面来理解对象的创建语句 Student st = new Student();对于new Student(); 表示在堆内存创建一个对象,画下图所示: 而 Sudent st = new Student(); 表示把对象的首地址赋给变量st,所以st会指向对象的地址,如下图: 所以从表面理解,st就是

java中的方法理解

1.java 方法的格式<修饰符><返回类型><方法名>(<参数列表>)返回类型说明了方法的返回值类型,如果不需要返回值,返回类型应该声明为void,需要返回值的,必须与说明的返回类型相同.2.如果一个方法的参数定为不定参数的话,这个参数可以根据参数个数动态生成一个数组,然后传入方法执行.不定参数有两个规定:方法的参数列表中最多只有一个不定长度的参数:不定长度的数组的位置必须是最后一个参数.不然不能通过编译.3.java中每个方法的返回值,有且仅有一个,因为

Java中Volatile的理解

首先我们知道Java中的内存模型 即:线程工作内存——主内存 工作内存是线程私有的,主内存是线程共有的 变量的初始化,生成都在主内存,工作内存只有使用到该变量时才从主内存加载操作 共八中原子性操作,read,load,use,assign,store,wirte,lock,unlock Java虚拟机规范之规定,不允许一个线程(我们称为线程A)丢弃它最近的assign操作,也就是说变量(我们称为x)在工作内存中被修改后需要同步到主内存,但是并未规定同步时间 非volatile变量太容易造成线程间