接口回调目的和用法解析

什么是函数回调?如何使用函数回调机制? 函数回调是一种将函数作为参数传递给另一个函数,并在后者内部执行的机制。简而言之,它允许你动态地决定在什么时候调用哪个函数。事件处理:当特定事件发生时,调用相应的回调函数来处理事件。排序和过滤:在排序或过滤数据时,将自定义比较函数传递给排序或过滤函数。执行特定操作:根据条件执行不同的操作,而不需要大量的条件语句。然后,你需要定义一个函数指针,用于存储回调函数的地址。函数指针的类型必须与回调函数的原型匹配。这个函数指针callback可以存储一个接受两个指向常量数据的指针并返回整数的函数的地址。 阅读详情

一、回调的含义和用途

1. 什么是回调

一般来说,模块之间都存在一定的调用关系,从调用方式上来看,可分为三类:

  1. 同步调用:同步调用是一种阻塞式调用,即在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。
  2. 异步调用:异步调用是一种类似消息或事件的机制解决了同步阻塞的问题,例如A通知B后,他们各走各的路,互不影响,不用像同步调用那样,A通知B后,非得等到B走完后,A才继续走。
  3. 回调:回调是一种双向的调用模式,也就是说,被调用的接口被调用时也会调用对方的接口,例如A要调用B,B在执行完又要调用A。

三种回调

2. 回调的用途

回调一般用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调。例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。


二、为什么会存在回调机制

举例1:

有一位老板(上层模块)很忙,他没有时间盯着员工(下层模块)干活,然后他告诉自己的雇员,干完当前这些事情后,告诉他干活的结果。这个例子其实是一个回调+异步的例子,再举一个例子,A程序员写了一段程序a,其中预留了回调函数接口,并封装好了该程序,程序员B让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。下面把上面的例子变成代码

1.首先创建一个回调接口,让老板得告知干完活如何找到他的方式:留下老板办公室地址:

/** 
 * 此接口为联系的方式,不论是电话号码还是联系地址,作为 
 * 老板都必须要实现此接口
 */  
public interface CallBackInterface {  

    public void execute();  
}  

2.创建回调对象,就是老板本人,因为员工干完活后要给他打电话,因此老板必须实现回调接口,不然员工去哪里找老板?

/** 
 * 老板是作为上层应用身份出现的,下层应用(员工)是不知道 
 * 有哪些方法,因此他想被下层应用(员工)调用必须实现此接口 
 */  
public class Boss implements CallBackInterface {  

    @Override  
    public void execute() {  
        System.out.println("收到了!!" + System.currentTimeMillis());  

    }  
} 

3.创建控制类,也就是员工对象,他必须持有老板的地址(回调接口),即使老板换了一茬又一茬,办公室不变,总能找到对应的老板。

/** 
 * 员工类,必须要记住,这是一个底层类,底层是不了解上层服务的 
 */  
public class Employee {  

    private CallBackInterface callBack = null;  

    //告诉老板的联系方式,也就是注册  
    public void setCallBack(CallBackInterface callBack){  
        this.callBack = callBack;  
    }  

    //工人干活  
    public void doSome(){  
        //1.开始干活了  
        for(int i=0;i<10;i++){  
            System.out.println("第【" + i + "】事情干完了!");  
        }  

        //2.告诉老板干完了  
        callBack.execute();  
    }  
} 

4.测试类代码:

public class Client {  

    public static void main(String[] args) {  

        Employee emp = new Employee();  

        //将回调对象(上层对象)传入,注册  
        emp.setCallBack(new Boss());  

        //开启控制器对象运行  
        emp.doSome();  
    }  

} 

举例2:

对于回调函数的理解可以参照C或C++中对回调函数的定义:

程序在调用一个函数时,将自己的函数的地址作为参数传递给程序调用的函数时(那么这个自己的函数称回调函数)

这里写图片描述

然而Java中没有指针,不能传递方法的地址,一般采用接口回调实现:把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。

例如:

一读者想借《软件技术学习与实践》这本书,但这本书已被其他读者借走了。于是,读者与图书馆管理员间发生了以下对话:

读者:“我把我的电话号码告诉你,等书一到就马上通知我。”

管理员:“好的。另一读者把书还回来后,马上给您打电话,书我先帮您留着。”

在上述这个场景中,读者就是“回调对象”,管理员就是“控制器对象”,读者的电话号码就是“回调对象的方法”。

在控制器类中引用了回调对象,因此就能调用回调方法,当控制器进行某些判断之后(如:监听鼠标单击操作)就会自动调用回调方法!简易流程图如下:

这里写图片描述

举例3:

假如有两个类
  • classA
  • classB

如果A要调用B的方法,则:在classA中创建B的对象
如果B要调用A的方法,则:在classB中创建A的对象

两个类构成一个循环的关系,“你中有我,我中有你”。这样操作在实际中最不可取,因为耦合度最高。所以要想办法打断其中的一条线,打破循环关系。
怎么打断呢?——接口回调

接口回调三部曲:

一、 在B类中创建事件接口interface

//B类是自定义Video类。在B类中创建,供逻辑层来实现具体逻辑
public interface ADVideoPlayerListener {

        public void onBufferUpdate(int time);

        public void onClickFullScreenBtn();

        public void onClickVideo();

        public void onClickBackBtn();

        public void onClickPlay();

        public void onAdVideoLoadSuccess();

        public void onAdVideoLoadFailed();

        public void onAdVideoLoadComplete();
    }

二、在A类中implement此接口

在逻辑层中实现此接口,并且实现相应方法

public class VideoAdSlot implements CustomVideo.ADVideoPlayerListener{

}

三、在A类中创建B类实例时,同时为B类setListener

在创建B类(自定义类CustomVideo)的时候,同时为它绑定一个Listener。

private void initVideoView() {
        //创建B类(自定义Video类)
        mVideoView = new CustomVideoView(mContext, mParentView);
        if (mXAdInstance != null) {
            mVideoView.setDataSource(mXAdInstance.resource);
            //注入一个listener
            mVideoView.setListener(this);
        }
        mParentView.addView(mVideoView);
    }

这样当,在B类(CustomVideo)中触发对应事件时,就会通知到A类(逻辑层)实现此方法。


private ADVideoPlayerListener listener;

@Override
    public void onClick(View v) {
        if (v == this.mMiniPlayBtn) {
            if (this.playerState == STATE_PAUSING) {
                if (Utils.getVisiblePercent(mParentContainer)
                        > SDKConstant.VIDEO_SCREEN_PERCENT) {
                    resume();
                    this.listener.onClickPlay();
                }
            } else {
                load();
            }
        } else if (v == this.mFullBtn) {
            this.listener.onClickFullScreenBtn();
        } else if (v == mVideoView) {
            /**
            *当点击视频区的时候,就会调用listener的onClickVideo
            *当事件真正产生的时候,就会调用A类(逻辑层)的onClickVideo()
            *这样也就完成了相互的通信。
            *A类既可以调用B类的的方法,B类也可以调用A类中的方法。
            */
            this.listener.onClickVideo();
        }
    }


总结:

在三层中,当业务层调用数据层时,是不需要把业务层自身传递到数据层的,并且这是一种上层调用下层的关系,比如我们在用框架的时候,一般直接调用框架提供的API就可以了,但回调不同,当框架不能满足需求,我们想让框架来调用自己的类方法,怎么做呢?总不至于去修改框架吧。许多优秀的框架提几乎都供了相关的接口,我们只需要实现相关接口,即可完成了注册,然后在合适的时候让框架来调用我们自己的类。

最后,再举一例,为了使我们写的函数接近完美,就把一部分功能外包给别人,让别人个性化定制,至于别人怎么实现不管,我唯一要做的就是定义好相关接口,这一设计允许了底层代码调用高层定义的子程序,增强程序灵活性,和反射有着异曲同工之妙,这才是回调的真正原因!

用一段话来总结下回调:上层模块封装时,很难预料下层模块会如何实现,因此,上层模块只需定义好自己需要但不能预料的接口(也就是回调接口),当下层模块调用上层模块时,根据当前需要的实现回调接口,并通过注册或参数方式传入上层模块即可,这样就实现下层调用上层,并且上层还能根据传入的引用来调用下层的具体实现,将程序的灵活性大大的增加了。


参考:

http://www.jcodecraeer.com/a/chengxusheji/java/2012/0822/370.html
https://blog.youkuaiyun.com/bjyfb/article/details/10462555

接口回调,用最简单的一个匿名内部类来讲解(附接口回调高级应用场景,让你对接口的了解登堂入室) 接口回调,是Java开发者必须要学的一个东西,可是他呢,书上没有,大神博客里也没有,所以导致了有部分小伙纸并不了解这个知识,所以这里做一个最简单的讲解。 (先不牵扯什么异步回调、同步回调) 首先,只需要记住一点,接口回调的含义就是把代码换个地方写。 正常我们是这样写的 public class Data3 extends MyData { Data3( 阅读详情

相关推荐

实现天翼短信验证码回调接口的源码解析

在当今复杂的网络环境中,接口通信是不同系统间交互数据的基础。回调接口,作为接口设计的一种模式,允许系统在完成特定事件后,主动通知其他系统,从而增强系统的交互性和响应性。回调接口(Callback Interface),通常指在进行某些操作时,系统将调用(或回调)用户提供的代码,以便用户根据业务需求实现具体功能。这是一种典型的设计模式,用于松耦合系统之间的交互。举例来说,当服务器向客户端发送了一个请求后,可能需要让客户端执行某些操作,并通过回调接口将执行结果返回给服务器。

weixin_30820933的博客 856

回调(callback)

1、什么是回调 软件模块之间总是存在一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。 同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用。 回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口。 异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方...

zjpp2580369的博客 4万+

Java调用第三方接口示范的实现

主要介绍了Java调用第三方接口示范的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

接口回调

自定义组件中的三种形式: //自定义组合控件 //自定义view (继承原生的) //自定义的view (view) 1.接口回调:就是  通过接口 来  调用  接口中的方法; 接口回调是指: 可以把使用实现了某一接口的类创建的对象的引用,赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口...

时念 2385

利用NURBS曲线进行点云曲面拟合算法

点云拟合曲面算法是将点云数据拟合成一个二次或高次曲面模型的算法。这种算法主要用于三维模型重建、计算机视觉、机器人感知、医学图像处理等领域。最小二乘法(Least Squares Method):通过最小化点到曲面距离的平方和来拟合曲面模型。三角剖分算法(Triangulation-Based Method):将点云构建成三角网格,再拟合成曲面模型。隐式曲面算法(Implicit Surface Method):通过定义一个隐式函数来表示曲面,然后用点云数据来估计隐式函数的系数。

weixin_44770969的博客 1万+

渗透测试实战—云渗透(AK/SK泄露)

渗透测试实战思路分享:getshell方法及横向移动方法,云安全(AK/SK泄露)

网安日记本的博客 4051

巧妙理解接口回调

一、为什么会有接口回调?什么是接口回调? 其实这两个问题是一个问题,知道了接口回调的原理自然就知道了为什么会有这么个东西。我们知道java中接口是不可以直接创建实例的,那么问题来了,假如我把一个接口声明为一个变量,那么我执行这个接口中的方法,接口没有实例它该怎么办呢?啊哈,这里自然又改出现java中的另一个特性—“多态”,这时java虚拟机自然会去找其子类,调用其子类中已经重载的该方法,这里就是接...

weixin_42814000的博客 1万+

QGIS插件实战:用百度地图AOI数据做个城市公园分析,从下载到出图全记录

本文详细介绍了如何利用QGIS的百度地图AOI插件进行城市公园分析,从插件安装、数据获取到空间分析与可视化全流程。通过实战案例演示了公园面积统计、服务范围缓冲区分析及专题地图制作,帮助用户高效完成城市绿地评估工作。

weixin_30790841的博客 556

java接口回调_Java编程接口回调一般用法代码解析

接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。Java接口回调一般用法:实现接口实际上和继承抽象类类似,只不过继承是在类的层面上操作,接口是在方法和常量集合的层面上操作,接口比抽象类更抽象、更简洁。可以把实现...

weixin_30561959的博客 485

运动目标成像必学:5分钟搞懂keystone变换原理与避坑指南

本文深入浅出地解析了雷达信号处理中的Keystone变换原理,它是解决运动目标距离徙动问题的关键技术。文章通过直观比喻和简化公式,阐述了该变换如何通过变量代换实现距离与慢时间的解耦合,将倾斜轨迹“掰直”,从而提升成像与检测性能。同时,文中重点指出了实际应用中关于大速度场景、插值误差、多目标处理及高阶运动补偿等关键避坑点,为工程实践提供了宝贵指南。

ios99的博客 403

基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现

本文详细介绍基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现。通过I2S接口直接传输PCM数据,避免SRC重采样,实现真正的HIFI级音质。涵盖硬件连接、软件架构、网络传输优化及实际音质对比,为音频爱好者提供高性价比的无损无线音频解决方案。

rnn9storyteller的博客 948

java接口回调、同步回调、异步回调

一、回调         回调用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调。         例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。         其实回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高

feifei 9021

PCB布线避坑指南:为什么你的差分线等长总调不好?AD19蛇形等长技巧详解

本文详细解析了AD19环境下PCB差分线等长调整的核心技巧与常见问题。从差分信号等长的底层逻辑到AD19规则配置,再到蛇形等长高级技巧和信号完整性验证,帮助工程师解决差分线等长调整中的难题,提升高速PCB设计的信号质量。

weixin_28738397的博客 382

N个例子让你彻底理解java接口回调

说到接口回调,对于初学者来说,理解是真的难啊,不过没有关系,看完本篇文章,你马上就能理解接口回调啦!概念什么是接口回调?用我的理解,就是:A让B去做一件耗时的操作,而且并不知道要花费多少时间,B做完了后,告诉A事情做完了,并且把结果给A。当然,B在做这件事的时候,A还可以做其他事情用途假设有一件耗时的时间,在网上下载一张图片,我们并不知道下载这张图片具体要花费多少时间,于是我们开一个线程去下载图片,

你缺少想象力的博客 6045

基于PSIM仿真的单相全桥逆变电路

根据单极性SPWM调制电路、双极性SPWM调制电路和逆变器拓扑可以得到完整的逆变器仿真电路模型。

weixin_59329579的博客 1万+

YOLOv8【第四章:注意力机制篇·第20节】一文讲透,注意力机制设计原则与选择指南 - 从原理到实践的系统化方法论!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》,该专栏持续复现网络上各种热门内容(全网YOLO改进最全最新的专栏,质量分97分+,全网顶流),改进内容支持(分类、检测、分割、追踪、关键点、OBB检测)。且专栏会随订阅人数上升而涨价(毕竟不断更新),当前性价比极高,有一定的参考&学习价值,部分内容会基于现有的国内外顶尖人工智能AIGC等AI大模型技术总结改进而来,嘎嘎硬核。    ✨ 特惠福利:目前活动一折秒杀价!一次订阅,永久免费,所有后续更新内容均免费阅读!

**My Coding Family** 896

接口回调全面总结

1.接口变量 接口和类一样,是Java中的一种数据类型,用接口声明的变量称之为接口变量。 接口变量中存储的是实现了该接口的类的实例的引用。 接口回调借用了C语言中指针回调的术语。 2.接口回调 VS 指针回调 指针回调,表示一个变量的地址在某一时刻存放在一个指针变量 中,这个指针变量可以间接操作该变量中存放的数据; 接口回调,指的是可以把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法。(其实当接口变量在调用被类实现的接口方法时,就是在通知相应的对

m0_53222768的博客 2439

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java 接口回调机制

日常开发中接口回调机制无处不在,刚开开始用时却总是晕晕乎乎,网上也有很多相关的文章介绍,但总是没有看得太明白,今天特意花时间来总结一下 一、什么是接口回调 在应用开发中,接口回调机制是一种常用的设计手段,也可以说是一种处理问题的模型,类之间,模块之间,都有一定的调用关系,一般来说,可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的

QDJdeveloper 6528

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android 关于接口回调原理的解析

接口回调,咋听起来可能会感觉很高大上,很复杂的逻辑的一种思想。特别是在Android中,每次都用,但有时候只是知道这样用,却不知道怎么实现的。但其实任何面向对象语言使用无非就是封装,继承,多态。其他的万变不离其中。要理解接口回调的机制,我觉得首先要清楚面向对象多态的概念。以下是自己在开发中的理解。 多态:c++中的理解时允许将子类类型的指针赋值给父类类型的指针,其实就是有一个容器保存了父类的指针类型

IZZY 4429

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java的接口回调和上转型对象

一、接口回调   接口回调是指: 可以把使用实现了某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。看下面示例。 interface People { void peopleList(); } class Student implements People { publicvoid peopleList() {

弑神灬索隆。 1321

Android onclick监听 接口回调机制 解析

Java的回调机制之前一直不太明白,只知道(嗯,这个地方好像是采用了回调,balabala),这两天工程不是很忙就抽了些时间从源码上学习巩固一下。 在Android上,最经典的回调应该是监听器Onclick回调了,其实还有Thread啊等等。辣么,重点来瞅瞅这个onClick()具体是怎么实现回调的涅。 1、先分析一下回调实现的理论知识 首先,来回顾下JAVA回调机制的过程

vito的专栏 6605

【接口回调】关于接口回调的理解

同步调用异步调用同步调用:同步调用是一种阻塞式的,就比如A对象中的一个方法调用了B对象的方法,那么A方法必须等B的方法执行完才能继续执行。异步调用:异步调用是一种非阻塞式的调用方式,解决了同步调用的阻塞问题,例如A再调用B之后和B一起继续执行。类似于主线程中,创建了一个子线程,二者并行。回调:而在同步调用和异步调用中又分为同步回调和异步回调,其目的都是为了降低,模块之间的耦合度。

指针指指针 1466

接口回调用法解析

应用场景:比如我写一个工具,下载任务,下载任务可能成功,可能失败。为了解耦,我的这个下载工具类只能专门用来下载,如何处理成功和失败,这个就交给调用方来完成。 回调接口 /** * @描述: 结果回调 */ public interface ResultCallback { void success(); void failure(Exception e); } ...

我弟是个程序员 5285

java接口回调实例

Java Interface ——接口回调解析及实例通常的认知中java的接口就是用来定义一两个功能函数,其实现类来重写实现这些方法,今天给大家介绍一种很受欢迎且有很大益处的使用方法——接口回调...

Passion‘s Blog’ 3866

浅析 接口回调

什么是接口回调?为什么要这样?上栗子。

Steven Jon 1251

android 接口回调全面,Android 回调机制--接口回调

刚开始学习接口回调的时候,乍一听接口回调这个名词感觉很高大上一样 于是就去网上找了一些接口回调的知识 网上总结的接口回调知识 感觉太臃肿 又是图 又是代码的搞不清楚 所以今天就把我对接口回调的理解分享给大家 希望刚学习这个知识点的朋友看了我的这篇文章 会很清楚理解接口回调这个知识点 也希望大家多提意见 对我的错误及时纠正 废话不多说 开始吧!分析接口回调的话 我们就举一个小小的例子来解释一下 看下...

weixin_36053084的博客 1241
上一篇: AsynTask解析
下一篇: Android知识整理1
ChoRyan Quan
博客等级 码龄11年 24粉丝 37原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值