回调java 简书_Java接口回调机制详解【转】

一、回调的含义和用途

1. 什么是回调?

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

2. 回调的用处

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

二、Java 实现接口回调

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

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

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

详细的代码如下:

创建一个回调接口:

public interface CallBack {

public void doEvent();

}

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

public class Boss implements CallBack {

public void doEvent() {

System.out.println("打电话给老板,告知已经完成工作了");

}

}

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

public class Employee {

CallBack callBack;

public Employee(CallBack callBack) {

this.callBack=callBack;

}

public void doWork() {

System.out.println("玩命干活中....");

callBack.doEvent();

}

}

测试类

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。

四、参考资料

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

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

相关文章

mfc指示灯报警显示_奔驰车辆常用指示灯功能讲解

点击箭头处“蓝色字”,关注我们哦!!今天将为大家解析车辆仪表盘指示灯功能,当然,我们为大家带来的是奔驰车型的指示灯解读。奔驰在指示灯上的设计是什么风格呢?下面我们就来带大家详细解读。疲劳驾驶报警指…

java无锁消费者框架_无锁并行框架多生产者多消费者模型

下面看一下多生产多消费者的模式,下面的代码是模拟100个生产者,每个生产者生产100个事件,然后有3个消费者,同时进行消费,共消费1W个事件,下面看一下代码:这边new出了3个消费者,并把消…

win10无法连接到这个网络_电脑无法连接网络怎么办?(有线网络篇)

哈喽!各位小伙伴大家好呀!好久不见,近期真的太多小伙伴咨询网络问题了,没办法,虽然以前写过相关文章,断网、网络卡、慢、掉线的常规解决方法不过可能还不够细致,本篇就尽量把所有的问题都提出解…

LeetCode反转链表java_Leetcode 反转链表系列 图解详细过程

对于一个程序猿来说,数据结构和算法的重要性就不用我多说了吧,算法题已然成了现在大厂笔试面试的重头戏,废话少说,Leetcode 刷起来呀。说起刷 Leetcode,我建议你按 tag 刷,不然只能像无头苍蝇,东…

amd插帧技术如何开启_联想ThinkPad笔记本电脑如何开启CPU的虚拟化技术图文教程...

联想ThinkPad笔记本电脑如何开启CPU的虚拟化技术图文教程很多情况下可能我们都需要开启CPU虚拟化技术,例如我们需要打开安卓模拟器,在打开安卓模拟器的时候如果提示您需要CPU虚拟化技术,那么我们需要在主板BIOS设置中进行开启,下面…

java中的同步关键字_Java中进程同步问题,锁 和synchronized 关键字的用法

标签:•对象的锁标志–每个对象都有一个锁标志–使用synchronized可与锁标志交互•synchronized关键字的用法有两种:–synchronized语句–synchronized方法•synchronized语句:synchronized (obj){//在synchronized语句块中//对obj的成员只能…

没有内存条电脑能开机吗_换内存加固态,老电脑也能快到起飞,附纯国产内存条雷赤测评...

我在公司里用的那台电脑是品牌机,配置有点低,处理器是i3-6100,内存是4GB,硬盘是1TB的机械,这个配置日常办公是没有问题的,但是现在有一些活已经超出了这个配置的能力,加之近期的一些工作还需要在…

java方法报错_.setUndecorated 方法报错

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼import java.awt.*;import javax.swing.*;public class FrameTest{public static void main(String[] args){EventQueue.invokeLater(new Runnable(){public void run(){JFrame frame new SimpleFrame();frame.setUndecorated(tru…

java面试加分_不只是给面试加分 -- Java WeakReference的理解与使用

前言: 看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak reference是什么, 怎么用, 只是期望有人能够提到这个concept和java的GC相关. 很可惜的是, 20多个拥有5年以上java开发经验的面…

嵌入式编程要不要学数据结构_少儿编程要不要学?其实国家早就给出了答案……...

随着人工智能的热度不断攀升,少儿编程越来越火,逐渐成为爸妈们的热门话题。自家的孩子适不适合学习少儿编程,很多专业人士发出了各种不同的声音。这也让很多望子成龙的家长一头雾水,分不清究竟该何去何从?那么&#xf…

nrf52840 gpiote如何配置中断输入_西门子S7-200 SMART PID回路控制,配置PID向导,查看项目组件...

本篇我们继续来学习西门子S7-200 SMART的PID回路控制,首先介绍一下如何配置PID向导。在工具菜单功能区单击PID按钮打开PID回路向导对话框,选择要组态的回路,最多可组态8个回路,这里我们选择回路0。选择回路0在左侧的树视图中单击回…

java 大流量高并发_【BAT面试题】如何应对大流量、高并发??

这是一道BAT大厂的面试题所谓高并发指的是:在同时或极短时间内,有大量的请求到达服务端,每个请求都需要服务端耗费资源进行处理,并做出相应的反馈。常用的高并发处理的思路与手段从服务端视角看高并发服务端处理请求需要耗费服务端…

创建一个storageevent事件_谈谈StorageEvent

编者按:本文作者 刘观宇,360 奇舞团高级前端工程师、技术经理,W3C CSS 工作组成员。纷纷红紫已成尘,布谷声中夏令新。夹路桑麻行不尽,始知身是太平人。 ——宋.陆游 《初夏绝句》我们在开发多Tab应用时候,常…

PHP留言并展示_利用PHP实现简单留言板

跟随bilibili教学视频一步一步实现简单的PHP留言板。第一个代码文件item.php,创建了一个Message,并连接了数据库。class Message{var $name;var $time;var $content;function __construct($n, $t, $c){$this->name $n;$this->time $t;$this->…

matlab数组平方的计算自定义函数_从零开始的matlab学习笔记——(38)简单数论计算函数:取整,gcd,lcm,质数,全排列...

matlab应用——求极限,求导,求积分,解方程,概率统计,函数绘图,三维图像,拟合函数,动态图,傅里叶变换,随机数,优化问题....更多内容尽在个人专栏&a…

bootstraptable导出excel独立使用_使用 EasyPOI 优雅导出Excel模板数据(含图片)

EasyPOI功能如同名字Easy,主打的功能就是容易,让一个没接触过POI的人员可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出。通过简单的注解和模板语言(熟悉的表达式语法),完成以前复杂的写法。…

php弹幕技术轮询,PHP+Ajax实现在线聊天长轮询

HTML首先我们放置一个获取数据按钮和数据存放地方#msg。jQuery我们向ajax.php请求,请求的时间设置80秒。在这80秒中若没有从服务端返回‘success’则一直保持连接状态,直到有数据返回或‘success’的值为0才关闭连接。在关闭连接后在继续下一次的请求。$(function()…

import pandas as pd什么意思_Pandas万花筒:让绘图变得更美观

全文共1803字,预计学习时长10分钟图源:tehrantimes流行 Python 数据分析库 Pandas 中的绘图功能一直是迅速绘制图表的首选之一。但是,其可用的可视化效果总是十分粗略,实用有余、美观不足。笔者常用 Pandas 的绘图功能快速地执行一…

php 匹配关键字,php获取搜索引擎搜索关键词关键字的正则表达式实现方法

获取搜索引擎关键词,然后针对性的显示匹配结果,对于提升用户访问友好性有很大的帮助。php获取搜索引擎关键词的方法,网上有一些,但是并不全面,而使用正则表达式则可以简单的实现该功能。参见如下代码示例:h…

jquery name选择器_jquery笔记

jQuery是一个封装好的特定的集合(方法和函数)。是一个库,封装了很多预先定义好的函数在里面。概念jQuery是一个快速,简洁的js库。j是js,query是查询,把js中的DOM操作作了封装,我们可以快速的查询使用里面的功能。jQuer…