很多时候开发遇到一些Ui更新 网络数据获取,或者方法方法传递的时候会借助回调函数,那么什么是回调函数 百度百科是这么解释的  转载请标注出处 http://blog.csdn.net/sk719887916/article/details/40543483

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

主页君:这只手在c函数里 在java里就抛弃了指针这些说法 只有引用地址一说

1机制编辑

⑴定义一个回调函数
⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

意义编辑

因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
想知道回调函数在实际中有什么作用?先假设有这样一种情况:我们要编写一个库,它提供了某些排序算法的实现(如冒泡排序快速排序shell排序、shake排序等等),为了能让库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,能让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。
回调可用于通知机制。例如,有时要在A程序中设置一个计时器,每到一定时间,A程序会得到相应的通知,但通知机制的实现者对A程序一无所知。那么,就需一个具有特定原型的函数指针进行回调,通知A程序事件已经发生。实际上,API使用一个回调函数SetTimer()来通知计时器。如果没有提供回调函数,它还会把一个消息发往程序的消息队列
另一个使用回调机制的API函数是EnumWindow(),它枚举屏幕上所有的顶层窗口,每个窗口都可以通过它调用另一个程序提供的函数,并传递窗口的处理程序。例如:如果被调用者返回一个值,就继续进行迭代;否则,退出。EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。
不管怎么说,回调函数是继承自C语言的。在C++中,应只在与C代码建立接口或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法或仿函数(functor),而不是回调函数。
看过之后很多童鞋估计一头雾水 我也是云里雾里 这TM在说啥 
在javaweb里 一般我们只管的去理解回调是这样 理解的

所谓回调,就是客户程序Client调用服务程序sever中的某个函数A,然后sever又在某个时候反过来调用Client中的早就定义或者提供的函数B,对于sever来说,这个B()便叫做回调函数。一般说来,Client不会自己调用B,Client提供B的目的就是让sever来调用它。由于sever并不知道Client提供的B到底是啥东东,所以sever会约定B的接口规范(函数原型),然后由Client提前通过sever的一个函数R告诉sever自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web
Service以及Java的RMI都用到回调机制,可以访问远程服务器程序。

看了之后大家可能大概有点眉目 但是还是不是很清楚

但是安卓的回调和上诉描述有些许区别 最常见的就是安卓里面的点击事件 其实就是一个回调接口 ,他和代理有区别的。

我们下看下安卓 button的OnClickListener()源码

  public void setOnClickListener(OnClickListener l) {
		mListViewListener = l;
	}

	public interface OnClickListener  {

		public void onClick(View view);
	}

这段关键代码 可以看出 其实在view的OnClickListener就是一个接口对象 里面onClick(V)函数,我们再activity里其实就是去实现这个接口然后再去重写onClick()方法
 这样其实我们activity就是在调用OnClickListener的方法 对于OnClickListener来说他是提供接口原型让activity去调用 其实就是在操作原型方法,到这里大家都该清楚了吧

就是以主页君的理解回调就是A埋了地雷 ,留了引线 有一天B踩上了 前提B并不知道有没有地雷  结果A被炸飞了 ,A其实本以为去伤害B 最后反倒伤害了自己。说到这里其实很多人认为进而代理相似 代理就是角色的反转 并不关心结果 同样A埋了雷 上去炸C 但是他没有引线
只有B有引线 他就让B做踩雷引线工作 ,结果C被炸了 ,做到了A炸C事情 同样C也可以通过B炸A。具体代理细节在此不描述 有兴趣的话去看下菜鸟哥的的一本书《大话设计模式》、。

那既然安卓已经定义了自带的回调 那么我们怎么有必要自己去写回调嘛 ?答案是必须的要自己写得

请看下面一个需求

比如有个需求是Listview里面有个点击事件需要操作activity里非listview里面的view 那么你肯定想 这么简单直接在activity去实现OnClickListener操作view.
但是有的时候我们需要adaper里面传值出来 或者直接让Adaper要实现某个方法, 但是只能activity才拥有这段方法的代码,这时候回调就来了  之前看过微信聊天的的部分源码 看到里面那就用到了回调

adapter

/**
	 *
	 *
	 * @author skay
	 */
	public interface ReplayOnclickListener {

		public void onReplayClick(ReplyBean q, View v);

		public void onLongPressMine(ReplyBean q, View v);

		public void onLongPressOther(ReplyBean q, View v);

		public void onClickOtherView(ReplyBean q, View v);
	}
   
<span style="font-size:24px;">Activity</span>
   这三方法其实就是点击adapter里面的item处理条目我的和别人的长按事件 短按事件  但是这个事件它没有自己去完成 只是定义了一个回调原型
public class chatlActivity extends BaseActivity implements

		ReplayOnclickListener{
@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		adapter = new ChatlistAdapter(this);
		adapter.setReplayOnclickListener(this);//这是需要在adapter里面定义setReplayOnclickListener()方法 需要要执行者(chatlActivity )注入进去
}

	@Override

public void onReplayClick(Question q, View v) {

		ReplayPopupWindowUtil.getInstance().showShareAndStore(this, v);
//此方法是弹出复制PopupWindow的
	}

	@Override
	public void onLongPressMine(ReplyBean q, View v) {

	}

	@Override
	public void onClickOtherView(ReplyBean q, View v) {
//这里你随便可以做操作 比如你调到另一页面然后再跳回来 或者你网络获取数据让这个函数调用也可以 只是一个简单的例子

	}
}

 到这里你可能已经明白来龙去脉了 我们熟悉下他的基本步奏:
1定义一个回调函数
 A(adapter)定义以几个接口函数 比如
onReplayClick() 就是所谓的原型

2 被调用者去制定原型格式 (接口)
B(activity)实现A制定的接口函数
3提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
B(activity)setReplayOnclickListener() 将自己实现的接口原型ReplayOnclickListener注入到A中
4当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

B通过实现的onReplayClick(Question q, View v) {} 方法去实现待定事件。

回调说白了也是接口的另一种实现,通过注入impl或callbak来实现某个接口原型的方式,将角色转移。android源码也是带有大量的回调实现,目前大型项目的模块化开发交互一般也需要这种回调方式进行初始化和一些传值。一般也喜欢称之为面向接口开发。



Android回调详解的更多相关文章

  1. Android ActionBar详解

    Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar   目录(?)[+]   第4 ...

  2. Android菜单详解(一)——理解android中的Menu

    前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至 ...

  3. 【转】Android菜单详解——理解android中的Menu--不错

    原文网址:http://www.cnblogs.com/qingblog/archive/2012/06/08/2541709.html 前言 今天看了pro android 3中menu这一章,对A ...

  4. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  5. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  6. Android 签名详解

    Android 签名详解 AndroidOPhoneAnt设计模式Eclipse  在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程 ...

  7. Android编译系统详解(一)

    ++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ...

  8. Android布局详解之一:FrameLayout

      原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6702273 FrameLayout是最简单的布局了.所有放在布局里的 ...

  9. 【整理修订】Android.mk详解

    Android.mk详解 1. Android.mk 的应用范围 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 一个Android.mk文件可以编 ...

随机推荐

  1. Hibernate之实体关系映射

    延迟加载与即时加载 例如Person类和Email类是一对多关系,如果设为即时加载,当加载Person时,会自动加载Email,如果设置为延迟加载,当第一次调用person.getEmails()时才 ...

  2. 分析MapReduce执行过程+统计单词数例子

    MapReduce 运行的时候,会通过 Mapper 运行的任务读取 HDFS 中的数据文件,然后调用自己的方法,处理数据,最后输出.Reducer 任务会接收 Mapper 任务输出的数据,作为自己 ...

  3. memcached实战系列(一)memcached安装

    下载并安装Memcached服务器端 我用的是cenos6.5 64位系统. libevent是个程序库,它将Linux的epoll.BSD类操作系统的kqueue等事件处理功能封装成统一的接口,具有 ...

  4. Swift基础语法(常量变量、数据类型、元组、可选、断言)

    本文来自Swift中文开发组,感谢翻译者的分享. 本文将分几部分对Swift对ios的语法做讲解.本文为第一节,主要讲解基础语法. 常量和变量 常量和变量把一个名字(比如maximumNumberOf ...

  5. Linux内核分配内存的方式

    page = alloc_pages(GFP_KERNEL, get_order(1234));分配失败返回NULLGFP_KERNEL  ---> 分配标志,当没有足够内存分配时,睡眠阻塞,直 ...

  6. Linux系统编程----孤儿进程

    什么是孤儿进程? 孤儿进程,  指在父进程退出后,而子进程还在运行,这个子进程就成了孤儿进程,这时由init进程(pid=1)接管 来看看例子: #include <stdio.h> #i ...

  7. Android 5.1 添加硬件抽象层(HAL)和JNI接口总结

    点击打开链接

  8. DVB-C系统中QAM调制与解调仿真

    本文简单记录一下自己学习<通信原理>的时候调试的一个仿真DVB-C(Cable,数字有线电视)系统中QAM调制和解调的程序.自己一直是研究"信源"方面的东西,所以对&q ...

  9. unix os下du df简单用法

    转自:http://dadoneo.iteye.com/blog/984963 du命令参数详解见:http://baike.baidu.com/view/43913.htm 下面我们只对其做简单介绍 ...

  10. C++编写ATM

          偶然看到的一段代码,代码虽然简单,但是挺有意思: #include <iostream> #include <conio.h> //全局变量 float sum_m ...