0

0

关于回调机制的代码详解

Y2J

Y2J

发布时间:2017-05-11 09:25:43

|

1629人浏览过

|

来源于php中文网

原创

这篇文章主要介绍了java回调机制实例详解的相关资料,需要的朋友可以参考下

java回调机制实例详解

以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式:

  • Class A实现接口CallBack callback——背景1

  • class A中包含一个class B的引用b ——背景2

  • class B有一个参数为callback的方法f(CallBack callback) ——背景3

  • A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法 C

  • 然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D

大家都喜欢用打电话的例子,好吧,为了跟上时代,我也用这个例子好了,我这个例子采用异步加回调

有一天小王遇到一个很难的问题,问题是“1 + 1 = ?”,就打电话问小李,小李一下子也不知道,就跟小王说,等我办完手上的事情,就去想想答案,小王也不会傻傻的拿着电话去等小李的答案吧,于是小王就对小李说,我还要去逛街,你知道了答案就打我电话告诉我,于是挂了电话,自己办自己的事情,过了一个小时,小李打了小王的电话,告诉他答案是2

名品购物网店系统
名品购物网店系统

适合品牌专卖店专用,从前台的美工设计就开始强调视觉形象,有助于提升商品的档次,打造网店品牌!后台及程序核心比较简洁,着重在线购物,去掉了繁琐的代码及垃圾程式,在结构上更适合一些中高档的时尚品牌商品展示. 率先引入语言包机制,可在1小时内制作出任何语言版本,程序所有应用文字皆引自LANG目录下的语言包文件,独特的套图更换功能,三级物品分类,购物车帖心设计,在国内率先将购物车与商品显示页面完美结合,完

下载
/** 
 * 这是一个回调接口 
 * @author xiaanming 
 * 
 */ 
public interface CallBack { 
 /** 
  * 这个是小李知道答案时要调用的函数告诉小王,也就是回调函数 
  * @param result 是答案 
  */ 
 public void solve(String result); 
}
/** 
 * 这个是小王 
 * @author xiaanming 
 * 实现了一个回调接口CallBack,相当于----->背景一 
 */ 
public class Wang implements CallBack { 
 /** 
  * 小李对象的引用 
  * 相当于----->背景二 
  */ 
 private Li li; 
 
 /** 
  * 小王的构造方法,持有小李的引用 
  * @param li 
  */ 
 public Wang(Li li){ 
  this.li = li; 
 } 
  
 /** 
  * 小王通过这个方法去问小李的问题 
  * @param question 就是小王要问的问题,1 + 1 = ? 
  */ 
 public void askQuestion(final String question){ 
  //这里用一个线程就是异步, 
  new Thread(new Runnable() { 
   @Override 
   public void run() { 
    /** 
     * 小王调用小李中的方法,在这里注册回调接口 
     * 这就相当于A类调用B的方法C 
     */ 
    li.executeMessage(Wang.this, question); 
   } 
  }).start(); 
   
  //小网问完问题挂掉电话就去干其他的事情了,诳街去了 
  play(); 
 } 
 
 public void play(){ 
  System.out.println("我要逛街去了"); 
 } 
 
 /** 
  * 小李知道答案后调用此方法告诉小王,就是所谓的小王的回调方法 
  */ 
 @Override 
 public void solve(String result) { 
  System.out.println("小李告诉小王的答案是--->" + result); 
 } 
  
}
/** 
 * 这个就是小李啦 
 * @author xiaanming 
 * 
 */ 
public class Li { 
 /** 
  * 相当于B类有参数为CallBack callBack的f()---->背景三 
  * @param callBack 
  * @param question 小王问的问题 
  */ 
 public void executeMessage(CallBack callBack, String question){ 
  System.out.println("小王问的问题--->" + question); 
   
  //模拟小李办自己的事情需要很长时间 
  for(int i=0; i<10000;i++){ 
    
  } 
   
  /** 
   * 小李办完自己的事情之后想到了答案是2 
   */ 
  String result = "答案是2"; 
   
  /** 
   * 于是就打电话告诉小王,调用小王中的方法 
   * 这就相当于B类反过来调用A的方法D 
   */ 
  callBack.solve(result);  
 } 
}
/** 
 * 测试类 
 * @author xiaanming 
 * 
 */ 
public class Test { 
 public static void main(String[]args){ 
  /** 
   * new 一个小李 
   */ 
  Li li = new Li(); 
 
  /** 
   * new 一个小王 
   */ 
  Wang wang = new Wang(li); 
   
  /** 
   * 小王问小李问题 
   */ 
  wang.askQuestion("1 + 1 = ?"); 
 } 
}

通过上面的那个例子你是不是差不多明白了回调机制呢,上面是一个异步回调,我们看看同步回调吧,onClick()方法
现在来分析分析下Android View的点击方法onclick();我们知道onclick()是一个回调方法,当用户点击View就执行这个方法,我们用Button来举例好了

//这个是View的一个回调接口 
/** 
 * Interface definition for a callback to be invoked when a view is clicked. 
 */ 
public interface OnClickListener { 
 /** 
  * Called when a view has been clicked. 
  * 
  * @param v The view that was clicked. 
  */ 
 void onClick(View v); 
}
package com.example.demoactivity; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 
 
/** 
 * 这个就相当于Class A 
 * @author xiaanming 
 * 实现了 OnClickListener接口---->背景一 
 */ 
public class MainActivity extends Activity implements OnClickListener{ 
 /** 
  * Class A 包含Class B的引用----->背景二 
  */ 
 private Button button; 
 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
  button = (Button)findViewById(R.id.button1); 
   
  /** 
   * Class A 调用View的方法,而Button extends View----->A类调用B类的某个方法 C 
   */ 
  button.setOnClickListener(this); 
 } 
 
 /** 
  * 用户点击Button时调用的回调函数,你可以做你要做的事 
  * 这里我做的是用Toast提示OnClick 
  */ 
 @Override 
 public void onClick(View v) { 
  Toast.makeText(getApplication(), "OnClick", Toast.LENGTH_LONG).show(); 
 } 
 
}

下面是View类的setOnClickListener方法,就相当于B类咯,只把关键代码贴出来

/** 
 * 这个View就相当于B类 
 * @author xiaanming 
 * 
 */ 
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource { 
 /** 
  * Listener used to dispatch click events. 
  * This field should be made private, so it is hidden from the SDK. 
  * {@hide} 
  */ 
 protected OnClickListener mOnClickListener; 
  
 /** 
  * setOnClickListener()的参数是OnClickListener接口------>背景三 
  * Register a callback to be invoked when this view is clicked. If this view is not 
  * clickable, it becomes clickable. 
  * 
  * @param l The callback that will run 
  * 
  * @see #setClickable(boolean) 
  */ 
  
 public void setOnClickListener(OnClickListener l) { 
  if (!isClickable()) { 
   setClickable(true); 
  } 
  mOnClickListener = l; 
 } 
  
  
 /** 
  * Call this view's OnClickListener, if it is defined. 
  * 
  * @return True there was an assigned OnClickListener that was called, false 
  *   otherwise is returned. 
  */ 
 public boolean performClick() { 
  sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); 
 
  if (mOnClickListener != null) { 
   playSoundEffect(SoundEffectConstants.CLICK); 
    
   //这个不就是相当于B类调用A类的某个方法D,这个D就是所谓的回调方法咯 
   mOnClickListener.onClick(this); 
   return true; 
  } 
 
  return false; 
 } 
}

这个例子就是Android典型的回调机制,看完这个你是不是更进一步的理解了回调机制呢? 线程run()也是一个回调方法,当执行Thread的start()方法就会回调这个run()方法,还有处理消息都比较经典等等

【相关推荐】

1. Java免费视频教程

2. 阿里巴巴Java开发手册

3. 极客学院Java视频教程

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

3

2026.02.02

主流快递单号查询入口 实时物流进度一站式追踪专题
主流快递单号查询入口 实时物流进度一站式追踪专题

本专题聚合极兔快递、京东快递、中通快递、圆通快递、韵达快递等主流物流平台的单号查询与运单追踪内容,重点解决单号查询、手机号查物流、官网入口直达、包裹进度实时追踪等高频问题,帮助用户快速获取最新物流状态,提升查件效率与使用体验。

0

2026.02.02

Golang WebAssembly(WASM)开发入门
Golang WebAssembly(WASM)开发入门

本专题系统讲解 Golang 在 WebAssembly(WASM)开发中的实践方法,涵盖 WASM 基础原理、Go 编译到 WASM 的流程、与 JavaScript 的交互方式、性能与体积优化,以及典型应用场景(如前端计算、跨平台模块)。帮助开发者掌握 Go 在新一代 Web 技术栈中的应用能力。

1

2026.02.02

PHP Swoole 高性能服务开发
PHP Swoole 高性能服务开发

本专题聚焦 PHP Swoole 扩展在高性能服务端开发中的应用,系统讲解协程模型、异步IO、TCP/HTTP/WebSocket服务器、进程与任务管理、常驻内存架构设计。通过实战案例,帮助开发者掌握 使用 PHP 构建高并发、低延迟服务端应用的工程化能力。

1

2026.02.02

Java JNI 与本地代码交互实战
Java JNI 与本地代码交互实战

本专题系统讲解 Java 通过 JNI 调用 C/C++ 本地代码的核心机制,涵盖 JNI 基本原理、数据类型映射、内存管理、异常处理、性能优化策略以及典型应用场景(如高性能计算、底层库封装)。通过实战示例,帮助开发者掌握 Java 与本地代码混合开发的完整流程。

1

2026.02.02

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

52

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

25

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

10

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.1万人学习

C# 教程
C# 教程

共94课时 | 8.3万人学习

Java 教程
Java 教程

共578课时 | 55.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号