- 浏览: 536702 次
- 性别:
- 来自: 北京-郑州
文章分类
最新评论
-
痛苦不忧伤:
非常简单清晰
java向上转型 -
fusionyu:
IndexWriter没有正常关闭,导致索引循环能修复不?怎么 ...
关于搜索开发过程中的总结 -
yong7356:
学习一下。。。。。。。
eclipse打jar包 -
Zengchen2:
讲得很实用
内部类使用场景二:实现回调函数 -
sun19890214:
mark下,一些能看懂,一些看不懂
关于搜索开发过程中的总结
首先我们得了解一下什么叫做回调函数:
精妙比喻:回调函数还真有点像您随身带的BP机:告诉别人号码,在它有事情时Call您
回调用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调,例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。
其实回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它通过一个函数指针来保存这个回调,在需要调用时,只需引用这个函数指针和相关的参数指针。
其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。
关于回调的总结:
在Java中,通常就是编写另外一个类或类库的人规定一个接口,然后你来实现这个接口,然后把这个接口的一个对象作为参数传给别人的程序,别人的程序必要时就会通过那个接口来调用你编写的函数。
下面使用java回调函数来实现一个测试函数运行时间的工具类:
如果我们要测试一个类的方法的执行时间,通常我们会这样做:
java 代码
public class TestObject {
/**
* 一个用来被测试的方法,进行了一个比较耗时的循环
*/
public static void testMethod(){
for(int i=0; i<100000000; i++){
}
}
/**
* 一个简单的测试方法执行时间的方法
*/
public void testTime(){
long begin = System.currentTimeMillis();//测试起始时间
testMethod();//测试方法
long end = System.currentTimeMillis();//测试结束时间
System.out.println("[use time]:" + (end - begin));//打印使用时间
}
public static void main(String[] args) {
TestObject test=new TestObject();
test.testTime();
}
}
大家看到了testTime()方法,就只有"//测试方法"是需要改变的,下面我们来做一个函数实现相同功能但更灵活:
首先定一个回调接口:
java 代码
public interface CallBack {
//执行回调操作的方法
void execute();
}
然后再写一个工具类:
java 代码
public class Tools {
/**
* 测试函数使用时间,通过定义CallBack接口的execute方法
* @param callBack
*/
public void testTime(CallBack callBack) {
long begin = System.currentTimeMillis();//测试起始时间
callBack.execute();///进行回调操作
long end = System.currentTimeMillis();//测试结束时间
System.out.println("[use time]:" + (end - begin));//打印使用时间
}
public static void main(String[] args) {
Tools tool = new Tools();
tool.testTime(new CallBack(){
//定义execute方法
public void execute(){
//这里可以加放一个或多个要测试运行时间的方法
TestObject.testMethod();
}
});
}
}
通过上面的文字和代码我们可以理解了什么叫做java的回调。那么我们具体在什么时候使用回调函数呢?
在进行JDBC编程的时候,我们经常要写到try catch语句块,而如果采用回调技术,那么完全可以避免重复的去写,将自己的方法体使用一个回调接口的方法来实现,每次都传到同一个try catch当总,但是每一个方法的内容是不相同的。
再比如算法比较多的情况下,也可以采用这种实现模式来实现。最近看了SWT,发现里面好多的事件驱动都是采用回调来实现的。比如给按钮添加事件:
Button okButton = createButton(buttons, "&Ok", "Process input",
new MySelectionAdapter(){
public void widgetSelected(SelectionEvent e)
{
System.out.println("Name: " + nameField.getText());
System.out.println("Address: " + addrField.getText());
System.out.println("Phone number: " + phoneField.getText());
}
});
匿名内部类最常用的情况就是在回调当中的精彩表现。
回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口.
发表评论
-
java抽象类和抽象方法
2011-07-26 16:27 1279文章来源: http://blog.zol.com.cn/8 ... -
使用ConcurrentLinkedQueue惨痛的教训
2011-05-24 11:54 7067文章来源: http://blog.csdn.net/Kan ... -
字符串和三元运算符字符串相加优先级的问题
2011-03-17 10:33 1560周杨 10:25:37 我犯了一个非技术错误。 l ... -
java当中float以及double数据类型的掌握
2010-11-08 14:07 31076* java当中默认声明的小数是double类型的; ... -
java向上转型
2010-07-29 18:23 5250问题的由来:首先是方 ... -
关于java异常的一些讨论总结
2010-07-28 14:33 71函数是否抛异常跟函数语义密切相关:我认为函数抛不抛异常与函数本 ... -
runtime exception和checked exception
2010-07-28 14:08 381Java 提供了两类主要的 ... -
六种异常处理的陋习
2010-07-28 13:13 65注意,本文来自网络,看后如醍醐灌顶,特转载,以备温习! ... -
JDK(SDK) JRE JVM的说明
2010-07-09 11:26 1285SDK(Software Develop Kit,软件开发工具 ... -
线程的关闭
2010-07-04 00:51 1198线程的关闭: 针对Thread类的stop方法: 该方法具 ... -
生产者消费者模型
2010-07-04 00:46 1188每一个对象除了有一个锁之外,还有一个等待队列(wait set ... -
线程的死锁
2010-07-04 00:41 877关于线程的同步,http://buaawhl.iteye.co ... -
关于对线程的两种实现方式的选择
2010-07-03 22:56 1089如果不需要修改除了run方法之外的其他方法的话,那么最好去实现 ... -
java线程模型
2010-07-03 21:50 1947Java运行时系统实现了一 ... -
ByteArrayInputStream和ByteArrayOutputStream
2010-06-08 16:56 5744ByteArrayInputStream的精髓是将一个字节数组 ... -
java当中的关于乱码的测试
2010-06-08 16:16 1129测试环境编码GBK 代码: public class ... -
字符,字节和编码
2010-06-08 15:48 751转自http://www.regexlab.com/zh/en ... -
关于java当中的父类和子类
2010-05-16 15:07 1660在java当中,父类对象不 ... -
java 乱码 Unicode
2010-03-30 18:25 21byte[] unicodeb= s.getBy ... -
OutputStream的writeUTF函数
2010-03-25 10:33 1804writeUTF public void wr ...
相关推荐
ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调 RegCloseKey 关闭系统注册表中的一个项(或键) RegConnectRegistry 访问远程系统的部分注册表 RegCreateKey 在指定的项下创建或...
应用程序可以实现自己的消息循环,也可以使用DXUT消息循环,注册相应的回调函数,可以让DXUT处理设备、帧消息事件。 为使用DXUT框架的消息循环,可以调用DXUTMainLoop()函数. DXUT框架剖析(5) 摘要: 应用程序...
自定义上传进度回调函数:您可根据自已的业务场景重新定义不同事件处理的方式,只需要修改上传回调示例函数即可。 * * * 五、辅助媒资上传目前支持2种方式: * 1.上传本地文件,不支持断点续传,最大支持5GB的...
08_C动态库升级成框架案例_方法1动态库中直接添加回调函数_传智扫地僧 09_C动态库升级成框架案例_方法2把回调函数缓存到动态库_编写 10_C动态库升级成框架案例_方法2把回调函数混存到动态库_测试 11_C++基础课程day...
第二章 多窗口类浏览器设计 11 2.1 多窗口类浏览器需求分析 11 2.1.1 Activity简介 11 2.1.2 Fragment简介 11 2.1.3 多窗口类浏览器需求 12 2.2 多窗口浏览器模式的实现机制 12 2.2.1安卓移动端多窗口浏览器框架 12 ...
+为ExtAspNet.Alert.Show增加点击确定的JavaScript回调函数。 -一个典型应用,在Window控件中打开新页面,如果传递的参数不正确,则首先提示参数不对然后关闭此弹出窗口。 -ExtAspNet.Alert.Show("参数错误!",...
+为ExtAspNet.Alert.Show增加点击确定的JavaScript回调函数。 -一个典型应用,在Window控件中打开新页面,如果传递的参数不正确,则首先提示参数不对然后关闭此弹出窗口。 -ExtAspNet.Alert.Show("参数错误!",...
ANTLR生成的语法分析器能够自动建立名为语法分析树(parse tree)的视图,其他程序可以遍历此树,并在所需处理的结构处触发回调函数。在先前的ANTLR 3中,用户需要补充语法来创建树。除了自动建立树结构之外,ANTLR ...