概述

我们先看一下维基百科对回调函数的定义:

在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。

举个栗子

我们看一下android中最经典的View.setOnClickListener()源码:

1.定义接口

/**

* 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);

}

2.注册回调函数

/**

* 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(@Nullable OnClickListener l) {

if (!isClickable()) {

setClickable(true);

}

getListenerInfo().mOnClickListener = l;

}

3.执行回调函数

/**

* Call this view's OnClickListener, if it is defined. Performs all normal

* actions associated with clicking: reporting accessibility event, playing

* a sound, etc.

*

* @return True there was an assigned OnClickListener that was called, false

* otherwise is returned.

*/

public boolean performClick() {

final boolean result;

final ListenerInfo li = mListenerInfo;

if (li != null && li.mOnClickListener != null) {

playSoundEffect(SoundEffectConstants.CLICK);

li.mOnClickListener.onClick(this);

result = true;

} else {

result = false;

}

sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);

return result;

}

4.调用View的注册回调函数方法

view.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//do something

}

});

ok了,这样就完成了一次完整的回调函数.

总结一下

首先,在MainActivity中通过View中的setOnclickListener方法的参数将OnClickListener 接口的实现者传给了View,最终在被点击时在performClick方法中,执行了实现者的onClick方法.

是不是就如维基百科上的回调定义:通过函数参数传递到其它代码的,某一块可执行代码的引用.O(∩_∩)O.

如何理解android的函数,通过Android源码理解回调函数相关推荐

  1. python中split函数源代码_Pandas.split()函数用法及源码

    Pandas.split()函数用法及源码 发布时间:2018-05-08 10:44, 浏览次数:1092 , 标签: Pandas split Python数据分析博文汇总 * Pandas重复值 ...

  2. Android --- IjkPlayer 阅读native层源码之解码成功后的音频数据如何发送回Android播放(九)

    整章目录:Android------- IjkPlayer 源码学习目录 本篇会有很多源代码,请注意阅读每行代码上面的注释. 本篇介绍的主要内容为上图红框圈起部分: 在前面介绍了如何将一个AvPack ...

  3. android SDK-25事件分发机制--源码正确解析

    android SDK-25事件分发机制–源码正确解析 Android 事件分发分为View和ViewGroup的事件分发,ViewGroup比View过一个拦截判断,viewgroup可以拦截事件, ...

  4. Android ---- Ijkplayer阅读native层源码之IjkMediaPlayer_prepareAsync(五)

    整章目录:Android------- IjkPlayer 源码学习目录 本篇会有很多源代码,请注意阅读每行代码上面的注释. 本篇介绍的主要内容为上图红框圈起部分: IjkMediaPlayer_pr ...

  5. Android Glide 3.7.0 源码解析(八) , RecyclableBufferedInputStream 的 mark/reset 实现

    个人博客传送门 一.mark / reset 的作用 Android Glide 3.7.0 源码解析(七) , 细说图形变换和解码有提到过RecyclableBufferedInputStream ...

  6. Android中mesure过程详解 (结合Android 4.0.4 最新源码)

    如何遍历并绘制View树?之前的文章Android中invalidate() 函数详解(结合Android 4.0.4 最新源码)中提到invalidate()最后会发起一个View树遍历的请求,并通 ...

  7. Android中layout过程详解 (结合Android 4.0.4 最新源码)

    上一篇文章Android中mesure过程详解 (结合Android 4.0.4 最新源码)介绍了View树的measure过程,相对与measure过程,本文介绍的layout过程要简单多了,正如l ...

  8. 【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )

    文章目录 I . 源码编译配置 II . 构建脚本配置 III . NDK 函数库打包配置 IV . Java 与 C 代码示例 V . CMake 配置 ( CMakeLists.txt ) VI ...

  9. Android多线程之IntentService源码解析

    想要了解 IntentService 的工作原理需要先对 Android 系统中以 Handler.Looper.MessageQueue 组成的异步消息处理机制以及 HandlerThread 有所 ...

  10. Android磁盘管理-之vold源码分析(2)

    作者:gzshun. 原创作品,转载请标明出处! Vold是Android系统处理磁盘的核心部分,取代了原来Linux系统中的udev,主要用来处理Android系统的热插拔存储设备.在Android ...

最新文章

  1. 清华大学梁宸计算机系,应用数学专业论文
  2. CentOS 7 安装 PostgreSQL 教程
  3. python2好还是python3好-Python 2 和 Python 3 有哪些主要区别?
  4. 前端HTML、JavaScript、CSS技术的日常记录
  5. Caused by: java.sql.SQLException: Column ‘某个字段‘ cannot be null
  6. 在发布ASP.NET网站的时候,出现state server错误
  7. 高精度地图的学习笔记
  8. 《计算机网络:自顶向下方法(原书第6版)》一2.7 TCP套接字编程
  9. Hive:用Java代码通过JDBC连接Hiveserver
  10. C语言记录元音字母的位置,求元音字母
  11. [转载]Web Frameworks for Python by Guido van Rossum
  12. foreman架构的引入4-安装Foreman1.6.3架构(foreman与puppetmaster分离)
  13. OracleLinux6的安装
  14. Aspose.word保存PDF时进行授权访问设置
  15. FOXIT PDF EDITOR工具分割PDF
  16. pano2vr怎么制作漫游_全景图如何制作?Pano2VR制作FLASH全景图图文教程(附Pano2VR下载)...
  17. 【JY】橡胶支座的简述和其力学性能计算
  18. 白天黑夜、中午和傍晚的固定配色绘画技巧
  19. ESP8266 WIFI探针
  20. HDOJ--1162--Eddy's picture

热门文章

  1. 基于TableStore/MaxCompute的数据采集分析系统介绍
  2. CSDN 十大技术主题盘点-云原生篇
  3. Gartner:云安全的未来——中国的安全访问服务边缘架构
  4. 4 年 46 个版本,一文读懂 Spring Cloud 发展历史
  5. 四大开源项目联合发布 腾讯已成Github全球贡献前十公司!
  6. Docker精华问答 | task与executor有什么关系?
  7. 自定义控件android.r,Android控件架构与自定义控件
  8. java 最大矩形_Java实现 LeetCode 85 最大矩形
  9. php url传递参数_互联网系统(APP、网站等)通信基石——会话(PHP版)
  10. ios弧形进度条_iOS如何实现环形进度条加载效果