回调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。
四、参考资料
回调java 简书_Java接口回调机制详解【转】相关推荐
- 回调java 简书_web3j函数回调使用详解
前面solc和web3编译和加载代码的步骤参考其他文章. web3j中deploy代码 solidity代码 pragma solidity >0.4.18; contract SimpleVo ...
- java type 简书_Java中的Type详解
ParameterizedType 参数化类型的使用 package com.keytop.att; /** * 实体类 * Created by fengwenhua on 2017/4/25. * ...
- Java垃圾回收(GC)机制详解
Java垃圾回收(GC)机制详解 转自:https://www.cnblogs.com/xiaoxi/p/6486852.html 一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因 ...
- java jtable组件_java中jtable组件详解实例
java中jtable组件详解实例 java 表格控件 JTable 常用操作详解 JTable 是 Swing 编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处.一 ...
- java多线程代码_java多线程实例代码详解
原文:http://blog.csdn.net/paranoidyang/article/details/70184523 作者:Paranoidyang 线程与进程的区别 (1)程序是一段静态的代码 ...
- java异常例子_java 异常的实例详解
java 异常的实例详解 1.异常的定义:程序在运行时出现不正常情况. 异常的划分: Error:严重的问题,对于error一般不编写针对性的代码对其进行处理. Exception:非严重的问题,对于 ...
- 【Java】反射( reflection)机制 详解
目录 1. 定义 2. 用途(了解即可) 3. 反射的基本信息 4. 反射相关的类(重要) 4.1 Class类(反射机制的起源 ) 4.2 Class类中的相关方法(方法的使用方法在后边的示例当中) ...
- java list用法_java list的用法详解
java list的用法详解 java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中.以下是百分网小编搜索整理的关于java list的用法详解,需要的朋友可以参考一下!想了解更多相关 ...
- java aqs原理_Java并发之AQS详解
一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)! 类如其名,抽象的队列式的同步器,AQ ...
最新文章
- python前端开发招聘_web前端和python学哪个出来工资高?
- Linux下CMake简明教程(八) 添加编译选项
- C/C++语言堆栈指引
- SpringCloud feign 的三种超时时间配置
- 永远要跟比你更成功的人在一起
- 解决鼠标滚动的时候多次执行函数
- DELPHI TreeView 文件目录树和 设置节点图标 完整
- PostgreSQL 增量备份详解以及相关示例
- 中国电信天翼云进入4.0阶段 打造一朵无处不在的分布式云
- utf8转gb2312 c语言,UTF-8, Unicode, GB2312格式串转换之C语言版
- java string 数据结构_java 数据结构(一):java常用类 一 String类
- PropertyGrid伴侣PropertyTable
- 你真的懂病毒式营销吗
- macOS Monterey兼容哪些Mac电脑?
- android svn上传代码,Android应用开发之项目上传svn(Android Studio)
- 解决win10开启移动热点共享手机连上后无法上网的问题
- 数据库作业8:SQL练习5 - SELECT(嵌套查询EXISTS、集合查询、基于派生表的查询)
- HTML语言标记详解
- 基于Web实现在线绘画拓扑图[GraphEditor]
- Java开源 开源工作流
热门文章
- 数字图像处理-7频域滤波
- 计算机视觉三大顶级会议ICCV,CVPR,ECCV网址
- 图像变换dpi(tif->jpg),直方图均衡化,腐蚀膨胀,分水岭,模板匹配,直线检测
- 近代数字信号处理实验-DFT分析信号的频谱
- Redis配置文件常用配置消息解说--版本5.0.9
- 小甲鱼 OllyDbg 教程系列 (一) :二进制破解科普系列之 ReverseMe
- Google 的 C++ 代码规范
- Effective Java~58. for-each 循环优先于传统的for 循环
- oracle查看锁表进程,杀掉锁表进程
- jmeter里的连接数_Jmeter之连接问题