java-回调机制详解

转:http://blog.csdn.net/llayjun/article/details/50454148

阅读目录

  • 一、前言
  • 二、回调的含义和用途
  • 三、Java实现接口回调 
  • 四、Android中的接口回调
  • 五、参考资料

一、前言

最近在看android fragment与Activity进行数据传递的部分,看到了接口回调的内容,今天来总结一下。

 

二、回调的含义和用途

1、什么是回调?

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

 

2、回调的用途

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

 

三、Java实现接口回调

在C/C++中,要实现回调函数,被调用函数要告诉调用者自己的指针地址。但是Java没有指针地址,不能传递方法的地址,一般采用接口回调的方法来实现:把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被调用类实现的接口的方法。

原理:首先创建一个回调对象,然后再创建一个控制器对象,将回调对象需要被调用的方法告诉控制器对象,控制器对象负责检查某个场景是否出现或某个条件是否满足,当满足时,自动调用回调对象的方法。

例如老板A对员工B说,我现在交给你一个任务,并且我把我的电话号码给你,你一旦完成任务就给我打电话。

详细的代码如下:

1、创建一个回调接口

public interface CallBack{ public void doEvent(); }

2、创建回调接口的实现类,此例中,员工干完活后还要干什么事情是老板说了算的。

public class Boss implements CallBack{ public void doEvent(){ System.out.println("打电话给老板,告知已经完成工作了"); } }

3、创建控制类,也就是本例中的员工对象,他要持有老板的地址(即回调接口)

public class Employee{ CallBack callBack; public Employee(CallBack callBack){ this.callBack=callBack; } public void doWork(){ System.out.println("玩命干活中...."); callBack.doEvent(); } }

4、测试类

public class TestMain{ public static void main(String[] args){ //创建控制器对象,将提供给他的回调对象传入 Employee employee=new Employee(new Boss()); //启动控制器对象运行 employee.doWork(); } }

运行结果截图:

 

四、Android中的接口回调

在android中回调机制被大量的使用。比如,在Activity中定义了很多生命周期的不同状态要调用的方法,这些方法都是空实现,系统框架要调用,用户也要调用来实现。

举个简单的例子就是Button的点击响应事件实现机制

button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } });

OnClickListener就是android系统所约好的接口,然后在我们写的应用程序中传入回调对象,这样就可以达到接口统一,实现不同的效果。这种实现机制类似于下面的代码:

public class A{ public void setOnClickListener(OnClickListener onClickListener){ onClickListener.onClick(); } public interface OnClickListener{ public void onClick(); } }

public class B { public static void main(String[] args){ A a=new A(); a.setOnClickListener(new OnClickListener(){ public void onClick(){ // TODO 自动生成的方法存根 } }); } }

其中A相当于Button,a即button按钮,B类相当于View。

五、参考资料

  1、http://blog.csdn.net/bjyfb/article/details/10462555

  2、http://www.jcodecraeer.com/a/chengxusheji/java/2012/0822/370.html

 

转载于:https://www.cnblogs.com/Yangtuo/p/7265172.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lfi读取php,php LFI读php文件源码以及直接post webshell

php LFI读php文件源码以及间接post 网站shell假如如下一个场景(1) http://vulnerable/fileincl/example1.php?pageintro.php(该php文件包孕LFI漏洞)(2) 然而你不有中央能够upload你的网站shell代码(三) LFI只能读取到非php文件的源码(由于无…

根据请求上下文动态设置静态文件存储目录

前言上次,我们实现了根据 subpath 特定格式《动态设置静态文件存储目录》。例如:subpath静态文件路径/userAId/1.jpgc:\abc\userAId\1.jpg/userBId/1.jpgd:\xyz\123\userBId\1.jpg但是,如果 subpath 不能有这种特定格式,只能用通用…

BZOJ3019 : [Balkan2012]handsome

首先预处理出$f[i][j][k]$表示长度为$i$的序列,第一个位置是$j$,最后一个位置是$k$时合法的方案数。 从后往前枚举LCP以及那个位置应该改成什么。 用线段树维护区间内最左最右的已经确定的位置,以及区间内的合法方案数。 合并的时候只需要将左…

php smarty入门,smarty 快速入门

smarty 快速入门smarty定义:一个开源的模板引擎模板引擎是为了使用户界面与业务数据分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。功能将网站的数据和网站的界面实现分离(php和html代码)缓存页面下载www.smart…

ImageView的scaleType理解

2019独角兽企业重金招聘Python工程师标准>>> 1.android:scaleType“center” 保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size时,多出来的部分被截掉。 2.android:scaleType“center_inside” 以原图正常显示为目的&…

第一章 引论

1、什么是多道程序设计? 即内存中同时运行多道独立程序,宏观上所有程序同时运行,微观上程序串行,多道程序轮流占用CPU,提高了资源利用率。 2、什么是SPOOLING?读者是否认为将来的高级个人计算机会把SPOOLIN…

《ASP.NET Core 6框架揭秘》实例演示[24]:中间件的多种定义方式

ASP.NET Core的请求处理管道由一个服务器和一组中间件组成&#xff0c;位于 “龙头” 的服务器负责请求的监听、接收、分发和最终的响应&#xff0c;针对请求的处理由后续的中间件来完成。中间件最终体现为一个Func<RequestDelegate, RequestDelegate>委托&#xff0c;但…

Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载

为什么80%的码农都做不了架构师&#xff1f;>>> 随着 Google 推出了全新的设计语言 Material Design&#xff0c;还迎来了新的 Android 支持库 v7&#xff0c;其中就包含了 Material Design 设计语言中关于 Card 卡片概念的实现 —— CardView。RecyclerView也是谷…

php获取邮箱内容吗,php正则验证email邮箱及抽取内容中email的例子

1&#xff0c;php正则验证email格式&#xff1a;复制代码 代码示例:if (ereg(“/^[a-z]([a-z0-9]*[-_\.]?[a-z0-9])*([a-z0-9]*[-_]?[a-z0-9])[\.][a-z]{2,3}([\.][a-z]{2})?$/i; ”,$email)){echo “Your email address is correct!”;}else{echo “Please try again!”;}?…

Java——Arrays类操作数组的工具类

JDK中提供了一个专门用于操作数组的工具类&#xff0c;即 Arrays 类&#xff0c;位于 Java。util 包中。该类提供了一系列方法来操作数组&#xff0c;如排序、复制、比较、填充等&#xff0c;用户直接调用这些方法即可&#xff0c;不需要自己编码实现&#xff0c;降低了开发难度…

PropertiesUtil 获取文件属性值

有时候不要把一些属性值写死在代码中&#xff0c;而是写在配置在文件中&#xff0c;方便更改 PropertiesUtil工具类&#xff1a;读取key-value形式的配置文件&#xff0c;根据key获得value值 1、测试类 public class Test{private static PropertiesUtil propertiesUtil new …

CORS——跨域请求那些事儿

【本期嘉宾介绍】睿得&#xff0c;具有多年研发、运维、安全等IT相关从业经历。目前从事CDN、存储、视频直播点播的技术支持。喜爱钻研&#xff0c;喜爱编码&#xff0c;喜爱分享。 在日常的项目开发时会不可避免的需要进行跨域操作&#xff0c;而在实际进行跨域请求时&#xf…

oracle 数据执行计划,Oracle里常见的执行计划

本文介绍了Oracle数据库里常见的执行计划&#xff0c;使用的Oracle数据库版本为11.2.0.1。1、与表访问相关的执行计划Oracle数据库里与表访问有关的两种方法&#xff1a;全表扫描和ROWID扫描。反映在执行计划上&#xff0c;与全表扫描对应的执行计划中的关键字是“TABLE ACCESS…

.NET MAUI实战 Dispatcher

详细内容这一期分享的内容非常简单&#xff0c;在之前使用过WPF的开发者对MVVM开发模式下ViewModel中后台线程转UI线程并不陌生使用Appplication.Current.Dispatcher。那么在.NET MAUI中也有同样的机制&#xff0c;存在于.NET MAUI Shell对象中。那么什么是Shell&#xff1f;官…

GDB 配置

GDB 配置 使用 GDB 扩展来配置 GDB 事实上我还是觉得原生的 GDB 就挺好&#xff0c;速度快&#xff0c;需要查看什么执行命令就可以。 GDB DashBoard https://github.com/cyrus-and/gdb-dashboard $sudo mkdir -m 777 ~/gdbinit; cd ~/gdbinit $git clone https://github.com/c…

Oracle区分中文和英文,oracle中中英文段落划分实现

oracle中关于中文占用字节数&#xff0c;不同的数据库有不同的情况&#xff0c;有的占用两个字节、有的占用三个字节&#xff0c;现在测试环境的数据库中文占用三个字节&#xff0c;要实现由中英文组成的段落字符串&#xff0c;按照每行占用多少字节重新分段&#xff0c;具体应…

未来哪些行业值得加入?

阅读本文大概需要5分钟。这个问题很多读者都问过&#xff0c;基本上每隔几篇原创就会有人留言问&#xff0c;还有公众号后台和知乎私聊。之前在一次留言中我承诺专门开一篇文章来聊聊这个话题&#xff0c;今天想着要兑现这个诺言了。为啥最近会存在这个问题呢&#xff0c;原因其…

虚拟机网络配置详解(NAT、桥接、Hostonly)

VirtualBox中有四种网络连接方式: NATBridged AdapterInternalHost-only AdapterVMWare中有三种&#xff0c;其实它跟VMWare的网络连接方式都是一样的概念&#xff0c;只是比VMWare多了Internal方式 在介绍四种工作模式之前&#xff0c;先说下虚拟网卡&#xff0c;虚拟机安装好…

Oracle收款核销了怎么撤销,21应收收款-核销取消或核销调整

注&#xff1a;本课程不包含学习下载资料目标人群&#xff1a;1、Oracle ERP/EBS初级顾问和技术顾问&#xff1b; 1、Oracle ERP/EBS用户熟练学习ERP系统的基本设置功能&#xff1b; 2、Oracle ERP/EBS财务初级顾问的学习&#xff1b; 3、其他对Oracle ERP/EBS有兴趣的想转行如…

微软宣布正式开源 Azure IoT Edge 边缘计算服务

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; 微软宣布&#xff0c;去年年底公开预览的 Azure IoT Edge 边缘计算服务已进入官方版&#xff0c;并通过 GitHub 将其开源。Azure IoT Edge 主要将基于云的分析和定制的业务逻辑转移到边缘设备&a…