论坛首页
论坛首页
模板
模板
课程
学院课程
产品手册
产品手册
开发者
开发者中心
回到官网
回到官网
我的课程
伙伴云客服论坛
»
论坛
›
S区
›
S软件开发
›
查看内容
0 评论
0 收藏
分享
Java 回调函数详解及使用
仁和
楼主
发布于 2023-4-19 13:41:16
阅读 987
查看全部
搜更多:
百度
谷歌
360
搜狗
搜搜
有道
必应
即刻
Java 回调函数详解
前言:
C语言中回调函数解释:
回调函数(Callback Function)是怎样一种函数呢?
函数是用来被调用的,我们调用函数的方法有两种:
直接调用:
在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。这里,A称为“主叫函数”(Caller),B称为“被叫函数”(Callee)。
间接调用:
在函数A的函数体里并不呈现函数B的函数名,而是使用指向函数B的函数指针p来使内存中属于函数B的代码片断得以执行——听起来很酷,是吧。
比起直接调用来,间接调用确实费事,那为什么还要使用间接调用呢?原因很简单——直接调用把函数名都写进函数体了,经过编译器那么一编译,板上钉钉,A注定调用的是B了,这样的程序只能依照程序员事先设计好的流程执行下去,太呆板了。此时,间接调用的宏大灵敏性就显现出来了。想一想,假设p是函数A的一个参数(参数是变量,是变量就可以变吗!),那么程序的最终用户完全可以通过操作来改变p的指向——这样,A在通过p调用函数的时候就有时机调用到不同的函数,这样程序的实用性和扩展性就强多了。
在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就称为回调。在调用接口时,需要严格的依照定义的参数和方法调用,并且需要处置函数的异步,否则会导致程序的解体。这样的解释似乎还是比较难懂,这里举个简单的例子,程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。目的到达。在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数。
正常情况下开发人员使用已经定义好的API,这个过程叫Call。但是有时这样不能满足需求,就需要程序员注册自己的程序,然后让事先定义好多API在适宜的时候调用注册的方法,这叫CallBack。
“通常大家说的回调函数一般就是依照他人(李四)的定好的接口规范写,等待他人(张三)调用的函数,在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
复制代码
理解“回调函数”
所谓回调,就是客户程序CLIENT调用效劳程序SERVER中的某个函数SA,然后SERVER又在某个时候反过来调用CLIENT中的某个函数CB,对于CLIENT来说,这个CB便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。
一般说来,CLIENT不会自己调用CB,CLIENT提供CB的目的就是让SERVER来调用它,而且是CLIENT不得不提供。由于SERVER并不晓得CLIENT提供的CB叫甚名谁,所以SERVER会约定CB的接口规范(函数原型),然后由CLIENT提早通过SERVER的一个函数R告诉SERVER自己将要使用CB函数,这个过程称为回调函数的注册,R称为注册函数。Web SERVERerviCliente以及Java的RMI都用到回调机制,可以访问远程效劳器程序。
下面举个通俗的例子:
某天,我打电话向你请教问题,当然是个难题,:),你一时想不出处置方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴致勃勃的说问题已经搞定,应该如此这般处置。故事到此完毕。这个例子说明了“异步+回调”的编程形式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必需在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机可以接收到你的呼叫,这是回调函数必需符合接口规范。
通过上面个人感觉到回调函数更多的应用就是结合异步。比如:ajax中jServer通过组件和效劳器的异步通信。
什么是回调函数
精妙比喻:回调函数还真有点像您随身带的BP机:告诉他人号码,在它有事情时Call您
回调用于层间协作,上层将本层函数装置在下层,这个函数就是回调,而下层在一定条件下触发回调,例如作为一个驱动,是一个底层,他在收到一个数据时,除了完本钱层的处置工作外,还将停止回调,将这个数据交给上层应用层来做进一步处置,这在分层的数据通信中很普遍。
其实回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必需由高层停止装置,这个装置函数其实就是一个低层提供的API,装置后低层不晓得这个回调的名字,但它通过一个函数指针来保管这个回调,在需要调用时,只需引用这个函数指针和相关的参数指针。
其实:回调就是该函数写在高层,低层通过一个函数指针保管这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。
感激阅读,希望能协助到大家,谢谢大家对本站的支持!
搜更多:
Java 回调函数详解及使用
callback回调函数
搜更多:Java 回调函数详解及使用
搜更多:Java 回调函数详解及使用
搜更多:Java 回调函数详解及使用
搜更多:Java 回调函数详解及使用
搜更多:Java 回调函数详解及使用
搜更多:Java 回调函数详解及使用
搜更多:Java 回调函数详解及使用
搜更多:Java 回调函数详解及使用
回复
举报
使用道具
分享
上一篇:
详解JAVA类加载机制(推荐)
下一篇:
关于springboot 配置文件中属性变量引用方式@@解析
全部回复
暂无回帖,快来参与回复吧
返回列表
发新帖
回复
本版积分规则
高级模式
B
Color
Image
Link
Quote
Code
Smilies
发表回复
回帖后跳转到最后一页
仁和
注册会员
主题
25
回复
27
粉丝
0
加好友
发私信
热点排行
1
如何搭建伙伴云系统,看了你就懂
2
重要 | 伙伴云送福利啦!2023年价格体系全
3
使用技巧分享: 巧用伙伴云OpenAPI SDK,提
4
移动端APP啥时候能进行后台管理
5
东鹏瓷砖: 跑赢疫情,只因抓住这一点
6
学会不求人哦~ 计算字段新增函数使用技巧
7
用扫一扫自动添加发票信息
标签
PMP
销售
管理
零代码
产品
云表格Pro
项目协作
零代码aPaaS
OKR
产品更新
解决方案
CRM客户关系管理
任务管理
进销存管理
售后管理
项目管理
学习资料
模板中心
伙伴学院
产品手册
客户案例
资料下载
开发者中心
关于我们
公司介绍
最新活动
媒体报道
BBS论坛
进一步了解
价格
全流程定制
企业微信
友情链接
取得联系
咨询专线
400 006 1585
关注服务号
微信交流群
服务协议
隐私政策
Cookie条款
© 2022 伙伴智慧(北京)信息技术有限公司
京公网安备11010802025927号
京ICP备12038259号
增值电信业务经营许可证:京B2-20201325
Created with
Huoban.
|
网站地图
快速回复
返回顶部
返回列表