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 不能有这种特定格式,只能用通用…

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也是谷…

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

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

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;具体应…

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

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

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

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

Windows下安装BeautifulSoup

电脑首先要安装好了python&#xff0c;我安装的是2.7。 下面就是bs4的安装过程了: 1.去官网下载BeautifulSoup4 2017.02.10目前最新版本&#xff1a;Beautiful Soup 4.3.2 2.解压文件 将下载得到的压缩包解压到任意文件夹&#xff0c;路径不含中文 3.打开cmd命令提示符 winr&am…

BZOJ1578: [Usaco2009 Feb]Stock Market 股票市场

S<50只股票D<10天的价格给出&#xff0c;求第一天开始用n<200000元最后能得到的最大钱数&#xff0c;保证答案<500000。 做D次完全背包即可&#xff0c;每次做完把dp数组清空。 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 #i…

OC如何跳到系统设置里的各种设置界面

当 iOS系统版本 < iOS7时 , 只能跳转到 系统设置页面 &#xff0c;楼主试了下&#xff0c;非真机是没有任何效果的 当iOS系统版本 < iOS 10.0 时 NSURL *url [NSURL URLWithString:"prefs:rootLOCATION_SERVICES"]; if( [[UIApplication sharedApplication]can…

虚拟DOM Diff算法解析

React中最神奇的部分莫过于虚拟DOM&#xff0c;以及其高效的Diff算法。这让我们可以无需担心性能问题而”毫无顾忌”的随时“刷新”整个页面&#xff0c;由虚拟DOM来确保只对界面上真正变化的部分进行实际的DOM操作。React在这一部分已经做到足够透明&#xff0c;在实际开发中我…

Azure 跨订阅迁移资源踩坑记

突然收到微软的邮件&#xff0c;提示我的一个 Azure 订阅已经到期&#xff0c;所以转为“禁用”状态&#xff0c;只能进行数据的导出和处理。在这个订阅里有不少较重要的资源在跑&#xff0c;直接关了可不行…于是开启了一个支持事件&#xff0c;台湾美眉的态度和声线真的没话说…

《ASP.NET Core 6框架揭秘》实例演示[25]:配置与承载环境的应用

与服务注册一样&#xff0c;针对配置的设置同样可以采用三种不同的编程模式。第一种是利用WebApplicationBuilder的Host属性返回的IHostBuilder对象&#xff0c;它可以帮助我们设置面向宿主和应用的配置。IWebHostBuilder接口上面同样提供了一系列用来对配置进行设置的方法&…