java Android 回调机制的详解

以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是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

[java] view
plain
copy

  1. /**
  2. * 这是一个回调接口
  3. * @author xiaanming
  4. *
  5. */
  6. public interface CallBack {
  7. /**
  8. * 这个是小李知道答案时要调用的函数告诉小王,也就是回调函数
  9. * @param result 是答案
  10. */
  11. public void solve(String result);
  12. }

[java] view
plain
copy

  1. /**
  2. * 这个是小王
  3. * @author xiaanming
  4. * 实现了一个回调接口CallBack,相当于----->背景一
  5. */
  6. public class Wang implements CallBack {
  7. /**
  8. * 小李对象的引用
  9. * 相当于----->背景二
  10. */
  11. private Li li;
  12. /**
  13. * 小王的构造方法,持有小李的引用
  14. * @param li
  15. */
  16. public Wang(Li li){
  17. this.li = li;
  18. }
  19. /**
  20. * 小王通过这个方法去问小李的问题
  21. * @param question  就是小王要问的问题,1 + 1 = ?
  22. */
  23. public void askQuestion(final String question){
  24. //这里用一个线程就是异步,
  25. new Thread(new Runnable() {
  26. @Override
  27. public void run() {
  28. /**
  29. * 小王调用小李中的方法,在这里注册回调接口
  30. * 这就相当于A类调用B的方法C
  31. */
  32. li.executeMessage(Wang.this, question);
  33. }
  34. }).start();
  35. //小网问完问题挂掉电话就去干其他的事情了,诳街去了
  36. play();
  37. }
  38. public void play(){
  39. System.out.println("我要逛街去了");
  40. }
  41. /**
  42. * 小李知道答案后调用此方法告诉小王,就是所谓的小王的回调方法
  43. */
  44. @Override
  45. public void solve(String result) {
  46. System.out.println("小李告诉小王的答案是--->" + result);
  47. }
  48. }

[java] view
plain
copy

  1. /**
  2. * 这个就是小李啦
  3. * @author xiaanming
  4. *
  5. */
  6. public class Li {
  7. /**
  8. * 相当于B类有参数为CallBack callBack的f()---->背景三
  9. * @param callBack
  10. * @param question  小王问的问题
  11. */
  12. public void executeMessage(CallBack callBack, String question){
  13. System.out.println("小王问的问题--->" + question);
  14. //模拟小李办自己的事情需要很长时间
  15. for(int i=0; i<10000;i++){
  16. }
  17. /**
  18. * 小李办完自己的事情之后想到了答案是2
  19. */
  20. String result = "答案是2";
  21. /**
  22. * 于是就打电话告诉小王,调用小王中的方法
  23. * 这就相当于B类反过来调用A的方法D
  24. */
  25. callBack.solve(result);
  26. }
  27. }

[java] view
plain
copy

  1. /**
  2. * 测试类
  3. * @author xiaanming
  4. *
  5. */
  6. public class Test {
  7. public static void main(String[]args){
  8. /**
  9. * new 一个小李
  10. */
  11. Li li = new Li();
  12. /**
  13. * new 一个小王
  14. */
  15. Wang wang = new Wang(li);
  16. /**
  17. * 小王问小李问题
  18. */
  19. wang.askQuestion("1 + 1 = ?");
  20. }
  21. }

通过上面的那个例子你是不是差不多明白了回调机制呢,上面是一个异步回调,我们看看同步回调吧,onClick()方法

现在来分析分析下Android View的点击方法onclick();我们知道onclick()是一个回调方法,当用户点击View就执行这个方法,我们用Button来举例好了

[java] view
plain
copy

  1. //这个是View的一个回调接口
  2. /**
  3. * Interface definition for a callback to be invoked when a view is clicked.
  4. */
  5. public interface OnClickListener {
  6. /**
  7. * Called when a view has been clicked.
  8. *
  9. * @param v The view that was clicked.
  10. */
  11. void onClick(View v);
  12. }

[java] view
plain
copy

  1. package com.example.demoactivity;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.view.View.OnClickListener;
  6. import android.widget.Button;
  7. import android.widget.Toast;
  8. /**
  9. * 这个就相当于Class A
  10. * @author xiaanming
  11. * 实现了 OnClickListener接口---->背景一
  12. */
  13. public class MainActivity extends Activity implements OnClickListener{
  14. /**
  15. * Class A 包含Class B的引用----->背景二
  16. */
  17. private Button button;
  18. @Override
  19. public void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. button = (Button)findViewById(R.id.button1);
  23. /**
  24. * Class A 调用View的方法,而Button extends View----->A类调用B类的某个方法 C
  25. */
  26. button.setOnClickListener(this);
  27. }
  28. /**
  29. * 用户点击Button时调用的回调函数,你可以做你要做的事
  30. * 这里我做的是用Toast提示OnClick
  31. */
  32. @Override
  33. public void onClick(View v) {
  34. Toast.makeText(getApplication(), "OnClick", Toast.LENGTH_LONG).show();
  35. }
  36. }

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

[java] view
plain
copy

  1. /**
  2. * 这个View就相当于B类
  3. * @author xiaanming
  4. *
  5. */
  6. public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
  7. /**
  8. * Listener used to dispatch click events.
  9. * This field should be made private, so it is hidden from the SDK.
  10. * {@hide}
  11. */
  12. protected OnClickListener mOnClickListener;
  13. /**
  14. * setOnClickListener()的参数是OnClickListener接口------>背景三
  15. * Register a callback to be invoked when this view is clicked. If this view is not
  16. * clickable, it becomes clickable.
  17. *
  18. * @param l The callback that will run
  19. *
  20. * @see #setClickable(boolean)
  21. */
  22. public void setOnClickListener(OnClickListener l) {
  23. if (!isClickable()) {
  24. setClickable(true);
  25. }
  26. mOnClickListener = l;
  27. }
  28. /**
  29. * Call this view‘s OnClickListener, if it is defined.
  30. *
  31. * @return True there was an assigned OnClickListener that was called, false
  32. *         otherwise is returned.
  33. */
  34. public boolean performClick() {
  35. sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
  36. if (mOnClickListener != null) {
  37. playSoundEffect(SoundEffectConstants.CLICK);
  38. //这个不就是相当于B类调用A类的某个方法D,这个D就是所谓的回调方法咯
  39. mOnClickListener.onClick(this);
  40. return true;
  41. }
  42. return false;
  43. }
  44. }

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

这也是小弟对回调机制的一点拙见,不懂的请留言,如果有错误希望指出!多谢!

时间: 2024-08-05 05:37:24

java Android 回调机制的详解的相关文章

android消息机制原理详解

android消息机制原理详解 因为之前使用的是CSDN默认的文本编辑器,而且也因为懒得学用MarkDown来写博客,所以排版上有一些问题.就上一篇写的设计模式之抽象工厂模式提出了这个问题(一个android群的群友提出来的,没有在评论里评论),所以以后的文章都用MarkDown来写了. 好了,言归正传,这篇文章我来介绍一下android消息机制的原理 Android消息机制概述 说到Android的消息机制,Android初级工程师(不包括那些初学者)肯定会想到Handler.是的,Andro

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

Java垃圾回收机制(GC)详解 简介: 垃圾回收GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变.垃圾收集的目的在于清除不再使用的对象.GC通过确定对象是否被活动对象引用来确定是否收集该对象.GC首先要判断该对象是否是时候可以收集.两种常用的方法是引用计数和对象引用遍历. 垃圾收集的算法分析: Java语言规范没有明确地说明JVM使用哪种垃圾

JAVA回调机制(CallBack)详解

序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题.但是,对于初学的我来说,缺了一个循序渐进的过程.此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教! 开始之前,先想象一个场景:幼稚园的小朋友刚刚学习了10以内的加法. 第1章. 故事的缘起 幼师在黑板上写一个式子 “1

【转载】JAVA回调机制(CallBack)详解

转载自http://www.cnblogs.com/heshuchao/p/5376298.html 序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题.但是,对于初学的我来说,缺了一个循序渐进的过程.此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教! 开始之前,先想象

Android随笔之——Android广播机制Broadcast详解

在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理.这个广播跟我们传统意义中的电台广播有些相似之处.之所以叫做广播,就是因为它只负责“说”而不管你“听不听”,也就是不管你接收方如何处理.另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收. 一.Android广播机制三要素: 1.广播(Broadcast):用于发送广播.是一种广泛应用的在应用间传输信息的机制 2.广播接收器(Broadcast

CSDN Android客户端开发(二):详解如何基于Java用Jsoup爬虫HTML数据

本文参考链接详细介绍如何使用Jsoup包抓取HTML数据,是一个纯java工程,并将其打包成jar包.希望了解如何用java语言爬虫网页的可以看下. 杂家前文就又介绍用HTTP访问百度主页得到html的string字符串,但html的文本数据如果不经过处理就是个文本字符串没有任何效果的.所谓的浏览器就是负责将文本的html"翻译"成看到的界面.在前文有介绍,这个csdn的客户端app分首页.业界.移动.研发.程序员.云计算五大类.以业界为例,http://news.csdn.net/ 

“全栈2019”Java第一百一十三章:什么是回调?回调应用场景详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第一百一十三章:什么是回调?回调应用场景详解 下一章 "全栈2019"Java异常第一章:什么是异常? 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小

给 Android 开发者的 RxJava 详解

作者:扔物线 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个月,我也发现国内越来越多的人开始提及 RxJava .有人说『RxJava 真是太好用了』,有人说『RxJava 真是太难用了』,另外更多的人表示:我真的百度了也谷歌了,但我还是想问: RxJava 到底是什么? 鉴于 RxJava 目前这种既火爆又神秘的现状,而我又在一年的使用

Android四大组件--Activity详解

Android四大组件--Activity详解 分类: android android应用android开发 本文的主要内容包括1.activity的建立.配置和使用:2.activity的跳转和传值:3.startActivityForResult:4.activity的生命周期. 1.activity的建立.配置和使用 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供一个可视的窗口,一般情况