很多时候开发遇到一些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. C++语言编译系统提供的内部数据类型的自动隐式转换

    C++语言编译系统提供的内部数据类型的自动隐式转换规则如下: 程序在执行算术运算时,低类型自动隐式转换为高类型. 在函数调用时,将实参值赋给形参,系统隐式的将实参转换为形参的类型,并赋值给形参. 函数 ...

  2. Pycharm中进行Python远程开发

    http://blog.csdn.net/pipisorry/article/details/52269952 PyCharm提供两种远程调试(Remote Debugging)的方式:    配置远 ...

  3. Struts 2 之资源国际化

    首先在struts.properties文件中加入以下内容: struts.custom.i18n.resources=messageResource  或在struts.xml中加入 <con ...

  4. How to generate the complex data regularly to Ministry of Transport of P.R.C by DB Query Analyzer

    How to generate the complex data regularly to Ministry of Transport of P.R.C by DB Query Analyzer 1 ...

  5. iOS注册远程推送消息证书后提示此证书签发者无效的解决办法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们在编写关于远程推送消息的App时需要注册一个相关的证书,我 ...

  6. [ExtJS5学习笔记]第十四节 Extjs5中data数据源store和datapanel学习

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/39031383 sencha官方API:http://docs.sencha.com/e ...

  7. 收藏了4年的Android 源码分享

    Android 超过2个G的源代码集合~~几乎涵盖了所有功能效果的实现,一应俱全~~应有尽有~~ 360云盘地址:Android 各类源码集合汇总 (提取码:f930) 另外,附上Github上及自己 ...

  8. ROS(indigo)ABB机器人MoveIt例子

    ROS(indigo)ABB机器人例子 参考网址: 1  http://wiki.ros.org/Industrial 2  http://wiki.ros.org/abb 3  https://gi ...

  9. SSH深度历险(三) EJB Session Bean有状态和无状态的区别与联系

    刚开始对两种sessionbean存在误解,认为有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用,而认为无状态是每次调用实例化一次,不保留用户信息.仔细分析并用实践检验后,会发现,事实 ...

  10. I/O操作之概述与导读

    I/O流可以表示很多不同种类的输入源和输出目的地,包括简单的字节流,基本数据(int.boolean.double等),本地化的字符,以及对象.一些流只是简单地传递数据,还有一些流可以操作和转换数据 ...