什么是回调:

回调函数就是通过函数指针(Android中的引用)调用的函数。

如果你把参数指针作为参数传递给另外一个函数,当这个指针被用来调用其指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在待定的事件或条件发生时,由另外的函数调用,对于该事件或条件进行响应。

(什么鬼,这是百度百科的解释,作为Android开发人员,如果没有C语言基础,可能看的一头雾水)

Android翻译官:

回调方法就是通过对象引用调用方法。(你在说啥?)

举个例子:

现在有这样一个需求:就是A类中有一个控件,当用户点击(或者滑动等操作)的时候,需要在B类中做出有回应的操作(比如请求网络等)。因为A类根本不知道用户啥时候点击这个控件,所以没办法做出具体的逻辑(说到这里很多人应该想到了接口这个词,恭喜你,你已经有了思路了),那该怎么办呢?这个时候就要用到回调。

怎么写回调方法:

回调就是一种简单的观察者模式,它的本质就是引用的传递。

观察者设计模式的使用
 步骤:
 1.找出被观察者,被观察者的特点就是事件的发生者

2.定义观察者,就是定义一个接口,接口中的方法就是观察者感兴趣的事件
 3.在被观察者中保存观察者的引用
 4.事件发生的时候通知观察者

我们写回调函数就用上面四个步骤。

下面用Button点击事件通过源码来做详细的讲解:

Button button = new Button(this);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        
    }
});

// 1.找出被观察者,被观察者的特点就是事件的发生者(我们这里事件发生者就是Button,第一步很简单)

//2.定义观察者,就是定义一个接口,接口中的方法就是观察者感兴趣的事件
/**
 * Interface definition for a callback to be invoked when a view is clicked.
 */
public interface OnClickListener {    //此时OnClickListener就是定义的观察者
    /**
     * Called when a view has been clicked.
     *
     * @param v The view that was clicked.
     */
    void onClick(View v); //而观察者所感兴趣的事件就是点击事件
}

//3.在被观察者中保存观察者的引用
/**
 * Listener used to dispatch click events.
 * This field should be made private, so it is hidden from the SDK.
 * {@hide}
 */
public OnClickListener mOnClickListener;

//4.事件发生的时候通知观察者

/**
 * 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;
}

总结:

通过分析Button点击事件的源码,还有通过上面四个步骤,我想大家现在应该可以很容易的写一个回调函数了,当你不知道一个方法中的具体逻辑的时候,很容易就想到

通过接口的形式暴露出去交给具体的执行的人去实现具体的逻辑,而整个过程中需要对接口引用进行传递,这个就是回调的本质。

Android程序中回调的讲解和使用相关推荐

  1. Android程序中读取使用已有的SQLite数据库

    方法一: 先在 Manifest 里添加权限: [java] view plaincopy print? <span style="font-size:12px;">& ...

  2. 将uni-app打包的H5放在 Android程序中在 webview 显示的两种方法

    将uni-app打包的H5放在 Android程序中在 webview 显示的两种方法 前言 Hash History 完事 前言 之前有个项目要同时做小程序和APP,本着节省时间的想法,研究了下un ...

  3. android 调用百度sdk后运行不了,解决android程序中oncreate方法中调用百度地图MKSearchListener接口不执行的问题...

    因为工作的需要,我在做软件的时候用到地图,并且需要从地图中搜索公交.商户等信息,因此选择百度地图.百度地图搜索的poi搜索正好符合我的需求,但是软件完成后发现在软件第一次执行的时候总是出错,百度地图无 ...

  4. android程序中实现打开另一个app

    1.已知要打开的apk的包名 String packetName = "com.onedollar.smartnurse"; Intent intent = getActivity ...

  5. 小程序中回调函数(callback)的理解

    什么是回调函数: //callback是一个函数 A callback is a function //作为另一个函数的参数 that is passed as an argument to anot ...

  6. android程序中关于webview加载html文件

    这两天用webview加载html时遇到很多问题也学到了不少,仅在这里记载以供以后参考,哪里不完善的还望有心人多加补充. (这里只介绍webview.loadUrl()) 思路:拿到网页url,然后把 ...

  7. Android程序中完美解决Zxing二维码扫描图片变形问题

    每部手机中设置了好几组预览图片的尺寸.以及实际图片的尺寸.只有当预览图的尺寸比例和实际图片的比例相同的时候就不会出现变形的情况. 对于ZXing扫描来说,实际图片的大小就是屏幕的大小,所以我们要从好几 ...

  8. android程序怎么导出数据库,将android程序中的数据库导出到SD卡

    private void copyDBToSDcrad() { String DATABASE_NAME = "数据库文件名"; String oldPath = "da ...

  9. android 程序中设置默认输入法

    String key = Settings.Secure.DEFAULT_INPUT_METHOD;//"default_input_method" String id = &qu ...

最新文章

  1. 养成良好的学习习惯-浅谈学习方法(1)
  2. 没有日志 mysql 5.6主从同步_mysql之 mysql 5.6不停机主从搭建(一主一从基于日志点复制)...
  3. android textview密文,TextView 明密文处理
  4. java按年月季度统计折线图_拆线图按年、按月,按天统计,前端传时间只要起始时间与结束时间...
  5. 有序数组转换为二叉搜索树
  6. [QA翻译]如何在Storm里拆分stream流?
  7. 简单的时间间隔调度任务
  8. UI_storyboard实现页面回调
  9. Python爬虫实战之爬取链家广州房价_03存储
  10. 干货资源共享之阿里云大学的学习路线和免费课程
  11. windows7删除计算机管理员权限,win7系统删除C盘文件需要管理员权限的解决方法...
  12. 三维建筑动画让你看懂真实的设计图
  13. 阿里云如何将一个域名解析到另一个域名上
  14. 有限覆盖定理证明其他实数完备性定理
  15. JAVA 7z Seven Zip 压缩和解压文件
  16. (理财七)如何挑选合适的贷款
  17. java常用混淆工具(有链接)
  18. Python版本与Matlab版本的对应关系
  19. 【26天高效学习Java编程】Day22:Java中的属性集-缓冲流-转换流-序列化流详解
  20. 宝宝专业智力测试软件,希-内学习能力测验软件 - 智力评估软件 - 唯普诺心理,心理测评系统,心理测评软件,婴幼儿智能发育,心理软件...

热门文章

  1. .netcore mvc docker环境jenkins一键部署(DevOps)
  2. UVA 11423 - Cache Simulator (树状数组)
  3. SpringMVC:学习笔记(1)——理解MVC及快速入门
  4. Centos7中systemctl命令详解
  5. unity, itween, closed path
  6. 数据结构作业——ギリギリ eye(贪心+优先队列/贪心+并查集)
  7. SQL约束和字段约束的创建和删除
  8. 80386的内存分页机制
  9. DevExpress XtraTreeList的复选框 禁用
  10. 使用MonoDevelop开发跨平台的应用程序