首页 技术 正文
技术 2022年11月15日
0 收藏 953 点赞 4,167 浏览 2377 个字

一,案例一

“通常大家说的回调函数一般就是按照别人(李四)的定好的接口规范写等待别人(张三)调用的函数,在C语言中,回调函数通常通过函数指针来传递;在Java中,通常就是编写另外一个类或类库的人(李四)规定一个接口,然后你(张三)来实现这个接口,然后把这个实现类的一个对象作为参数传给别人的程序,别人的程序必要时就会通过那个接口来调用你编写的函数。

使用技巧:定一个接口,在接口中声明我们想调用的方法。

在另一个方法中注册刚定义的回调接口

第一步:定义回调接口

package com.callback;

/**
* @since 2012-02-02
* @desc 定义回调接口
*/
public interface CallBackInterface {

public void doSome();

public void exectueMethod();
}

第二步:李四编写的程序

package com.callback;

/**
* @since 2012-02-02
* @desc 李四
*/
public class MethodB {

public double getTime(CallBackInterface callBack) {
long start = System.currentTimeMillis();
callBack.exectueMethod();
long end = System.currentTimeMillis();
System.out.println(“cost time=” + (end – start));
return end – start;
}
}

第三步:张三实现李四规定的接口

package com.callback;

/**
* @since 2012-02-02
* @desc 张三
*/
public class MethodA {

public static void main(String args[]){
MethodB b=new MethodB();
//返回值d只和MethodB有关,和接口中方法的返回值无关
double d=b.getTime(new CallBackInterface() {

//张三实现了李四定义的接口
public void exectueMethod() {
new MethodA().testMethod();
}

@Override
public void doSome() {

}
});
System.out.println(“d=”+d);
}

public void testMethod(){
for(int i=0;i<10000;i++){
System.out.print(“”);
}
}
}

 输出结果:

cost time=31
d=31.0

下面举个通俗的例子:
某天,我打电话向你请教问题,当然是个难题,:),你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
通过上面个人感觉到回调函数更多的应用就是结合异步。比如:ajax中jServer通过组件和服务器的异步通信。

二,案例二

public interface MyInterface {
void sayYourName();
}

public class MyClass {

public MyClass() {
Log.e(“WangJ”, “MyClass-constructor”); //标注构造函数
}

/* 用接口类型的对象作为输入参数 */
public void sayYourName(MyInterface myInterface){
Log.e(“WangJ”, “MyClass-sayYourName_start”); //标注方法开始
myInterface.sayYourName(); //遇到不知道具体实现的时候就用接口的抽象方法
Log.e(“WangJ”, “MyClass-sayYourName_finish”); //方法结束
}
}

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

MyClass myClass = new MyClass();
myClass.sayYourName(new MyInterface() { //实现接口并作为参数传入
@Override
public void sayYourName() {
Log.e(“WangJ”, “callBack-interface-implementor”); //具体操作实现
}
});
}
}

三,自己的理解

java中所谓的回调函数就是,张三已经定义好了一个方法,这个方法有自己的逻辑,只不过现在还不知给谁用而已。有一天,李四突然发现要用这个方法了,只要实现他写的这个方法的接口就可以了。

例如上面的案例一种的定义了一个程序花费时间的案例,在开始时间和结束时间中间有一行执行的代码,这行代码就是接口的抽象的方法,而调用者也就是李四只要去回调这个方法就可以了,就可以计算出他的代码所花费的时间了。

在比如说案例二的代码,在start 和finish中间定义了一个接口的方法,这时候后面的调用者只要去实现这个方法就可以了,就会把自己的逻辑加上去。

总而言之,java回调就是把自己的逻辑加到已经实现的方法中去。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,964
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,486
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,331
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,114
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,747
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,781