一、回调的含义和用途

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接口回调机制详解【转】相关推荐

  1. 回调java 简书_web3j函数回调使用详解

    前面solc和web3编译和加载代码的步骤参考其他文章. web3j中deploy代码 solidity代码 pragma solidity >0.4.18; contract SimpleVo ...

  2. java type 简书_Java中的Type详解

    ParameterizedType 参数化类型的使用 package com.keytop.att; /** * 实体类 * Created by fengwenhua on 2017/4/25. * ...

  3. Java垃圾回收(GC)机制详解

    Java垃圾回收(GC)机制详解 转自:https://www.cnblogs.com/xiaoxi/p/6486852.html 一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因 ...

  4. java jtable组件_java中jtable组件详解实例

    java中jtable组件详解实例 java 表格控件 JTable 常用操作详解 JTable 是 Swing 编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处.一 ...

  5. java多线程代码_java多线程实例代码详解

    原文:http://blog.csdn.net/paranoidyang/article/details/70184523 作者:Paranoidyang 线程与进程的区别 (1)程序是一段静态的代码 ...

  6. java异常例子_java 异常的实例详解

    java 异常的实例详解 1.异常的定义:程序在运行时出现不正常情况. 异常的划分: Error:严重的问题,对于error一般不编写针对性的代码对其进行处理. Exception:非严重的问题,对于 ...

  7. 【Java】反射( reflection)机制 详解

    目录 1. 定义 2. 用途(了解即可) 3. 反射的基本信息 4. 反射相关的类(重要) 4.1 Class类(反射机制的起源 ) 4.2 Class类中的相关方法(方法的使用方法在后边的示例当中) ...

  8. java list用法_java list的用法详解

    java list的用法详解 java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中.以下是百分网小编搜索整理的关于java list的用法详解,需要的朋友可以参考一下!想了解更多相关 ...

  9. java aqs原理_Java并发之AQS详解

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)! 类如其名,抽象的队列式的同步器,AQ ...

最新文章

  1. python前端开发招聘_web前端和python学哪个出来工资高?
  2. Linux下CMake简明教程(八) 添加编译选项
  3. C/C++语言堆栈指引
  4. SpringCloud feign 的三种超时时间配置
  5. 永远要跟比你更成功的人在一起
  6. 解决鼠标滚动的时候多次执行函数
  7. DELPHI TreeView 文件目录树和 设置节点图标 完整
  8. PostgreSQL 增量备份详解以及相关示例
  9. 中国电信天翼云进入4.0阶段 打造一朵无处不在的分布式云
  10. utf8转gb2312 c语言,UTF-8, Unicode, GB2312格式串转换之C语言版
  11. java string 数据结构_java 数据结构(一):java常用类 一 String类
  12. PropertyGrid伴侣PropertyTable
  13. 你真的懂病毒式营销吗
  14. macOS Monterey兼容哪些Mac电脑?
  15. android svn上传代码,Android应用开发之项目上传svn(Android Studio)
  16. 解决win10开启移动热点共享手机连上后无法上网的问题
  17. 数据库作业8:SQL练习5 - SELECT(嵌套查询EXISTS、集合查询、基于派生表的查询)
  18. HTML语言标记详解
  19. 基于Web实现在线绘画拓扑图[GraphEditor]
  20. Java开源 开源工作流

热门文章

  1. 数字图像处理-7频域滤波
  2. 计算机视觉三大顶级会议ICCV,CVPR,ECCV网址
  3. 图像变换dpi(tif->jpg),直方图均衡化,腐蚀膨胀,分水岭,模板匹配,直线检测
  4. 近代数字信号处理实验-DFT分析信号的频谱
  5. Redis配置文件常用配置消息解说--版本5.0.9
  6. 小甲鱼 OllyDbg 教程系列 (一) :二进制破解科普系列之 ReverseMe
  7. Google 的 C++ 代码规范
  8. Effective Java~58. for-each 循环优先于传统的for 循环
  9. oracle查看锁表进程,杀掉锁表进程
  10. jmeter里的连接数_Jmeter之连接问题