Android的回调
2016-01-01 14:07
302 查看
1、什么是回调?
百度百科的解释:
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
其实很多地方都有个通俗的说法来描述回调:
“场景:小明问妈妈什么时候开饭,妈妈说还要一会儿;小明说那我先去忙其他的,饭好了,电话叫我“;
在这个场景中:电话就是那个函数的指针,指向的是小明;特定的条件就是饭做好了;小明跟妈妈说饭好了,电话叫我,这个是将指针注册到妈妈的函数里;这里隐藏的回调函数就是小明吃饭这个函数,实现方是小明,而调用方是妈妈;
然而Android(Java语言没有指针的概念)没有指针的概念,在Andrioid中使用接口来替代表示指针的概念;最为普遍的例子就是Button的点击事件;
2、回调的实例
回调的实例一:
Button的点击事件:
首先我们知道Button是继承至View控件的;然后android对于View的触摸、点击等手势事件它的一套处理机制(后续有时间研究一下):
首先是Mainctivity:
然后是View源码位置为:/base/core/java/android/view/view.java;
上面我们可看成MainActivity中进行回调函数的注册及实现;View中是定义回调函数及调用回调函数。
三、一些总结
回调的用处:用于处理一些待处理的事件,我的理解是:A需要处理事情1,然而事情1还需要其他的工作的铺垫;那么我们就可以将处理铺垫的工作让B去处理,等B处理好了再通知A去做事情1;而在此期间A可以去处理其他事情不至于完全阻塞在事情1上;个人感觉有种异步处理的意味。
看到有的论坛谈论到此策略是观察者模式,有对设计模式熟悉的读者可以一同交流。
Android中的回调多见于处理手势,点击等事件,当然还有很多地方有用到,欢迎大家提出来一起讨论。
百度百科的解释:
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
其实很多地方都有个通俗的说法来描述回调:
“场景:小明问妈妈什么时候开饭,妈妈说还要一会儿;小明说那我先去忙其他的,饭好了,电话叫我“;
在这个场景中:电话就是那个函数的指针,指向的是小明;特定的条件就是饭做好了;小明跟妈妈说饭好了,电话叫我,这个是将指针注册到妈妈的函数里;这里隐藏的回调函数就是小明吃饭这个函数,实现方是小明,而调用方是妈妈;
然而Android(Java语言没有指针的概念)没有指针的概念,在Andrioid中使用接口来替代表示指针的概念;最为普遍的例子就是Button的点击事件;
2、回调的实例
回调的实例一:
Button的点击事件:
首先我们知道Button是继承至View控件的;然后android对于View的触摸、点击等手势事件它的一套处理机制(后续有时间研究一下):
首先是Mainctivity:
public class MainActivity extends Activity implements OnClickListener { Button btn_callback; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_callback = (Button) findViewById(R.id.btn); //注册回调 btn_callback.setOnClickListener(this); } //实现实现回调函数 @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()){ case R.id.btn: Toast.makeText(getApplicationContext(), "this is callback", Toast.LENGTH_LONG).show(); break; default: break; } } }
然后是View源码位置为:/base/core/java/android/view/view.java;
//接口对象 public OnClickListener mOnClickListener; ... ... //注册函数 public void setOnClickListener(OnClickListener l) { if (!isClickable()) { setClickable(true); } getListenerInfo().mOnClickListener = l; } //接口定义 public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was clicked. */ void onClick(View v); } //满足条件进行调用,这里是view对触控事件的处理逻辑 /** * 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; } /** * Directly call any attached OnClickListener. Unlike {@link #performClick()}, * this only calls the listener, and does not do any associated clicking * actions like reporting an accessibility event. * * @return True there was an assigned OnClickListener that was called, false * otherwise is returned. */ public boolean callOnClick() { ListenerInfo li = mListenerInfo; if (li != null && li.mOnClickListener != null) { li.mOnClickListener.onClick(this); return true; } return false; }
上面我们可看成MainActivity中进行回调函数的注册及实现;View中是定义回调函数及调用回调函数。
三、一些总结
回调的用处:用于处理一些待处理的事件,我的理解是:A需要处理事情1,然而事情1还需要其他的工作的铺垫;那么我们就可以将处理铺垫的工作让B去处理,等B处理好了再通知A去做事情1;而在此期间A可以去处理其他事情不至于完全阻塞在事情1上;个人感觉有种异步处理的意味。
看到有的论坛谈论到此策略是观察者模式,有对设计模式熟悉的读者可以一同交流。
Android中的回调多见于处理手势,点击等事件,当然还有很多地方有用到,欢迎大家提出来一起讨论。
相关文章推荐
- Android 媒体 IV-支持的媒体格式
- Android开发之 Android应用程序目录结构解析
- Intellij IDEA Android Studios 修改包名
- 2015年度总结--android开发
- Android开发之玩转SwitchButton
- 《Monkey Android》第13课CheckBox和RadioButton
- Visual Studio Emulator for Android 初体验
- android开发权威指南读书笔记
- Android项目文件结构
- [Android] Android SDK 安装代理设置
- android material design 之elevation,tinting,clipping
- Android TextView显示html样式的文字
- Android 标签控件
- Android开发之Handler的用法(源码分享)
- Android静默安装实现方案,仿360手机助手秒装和智能安装功能
- android屏幕适配之精准适配
- RxAndroid使用方法
- Android 自定义View( 雷达扫描)
- android开发环境下载
- android studio导入第三方包