Android中回调函数机制解析
来源:互联网 发布:jenkins 数据库配置 编辑:程序博客网 时间:2024/06/05 07:27
提示:在阅读本文章之前,请确保您对Touch事件的分发机制有一定的了解,如果您不了解请参阅:Touch事件的分发机制。
在Android的学习过程中经常会听到或者见到“回调”这个词,那么什么是回调呢?所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需要B类去实现,B类实现该方法后,它本身不会去调用该方法,而是传递给A类,供A类去调用,这种机制就称为回调。
下面我们拿具体的Button的点击事件进行模拟分析:
首先,在View类中我们能找到setOnClickListener(OnClickListener l)方法:
public void setOnClickListener(OnClickListener l) { if (!isClickable()) { setClickable(true); } getListenerInfo().mOnClickListener = l;}
可以看到,在该方法中将OnClickListener赋值给了mOnClickListener,那么我们继续向下找,会看到在performClick()方法中执行了我们实现的onClick()方法。
public boolean performClick() { sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); ListenerInfo li = mListenerInfo; if (li != null && li.mOnClickListener != null) { playSoundEffect(SoundEffectConstants.CLICK); li.mOnClickListener.onClick(this); return true; } return false;}
由此我们可以清楚的看不到,在父类中我们要用到onClick()方法,但是父类却没有去实现该方法,而是定义了一个方法setOnClickListener(OnClickListener l),如果子类想要自己能够响应点击事件,则它就必须重写父类的该方法,实现OnClickListener接口和它的onClick()方法。在子类实现该接口和方法后,将其通过参数传递给父类,在父类中执行onClick()方法。
那么,为什么会在父类中执行到该方法呢,这就要说到Android中的另一个重要的机制——触摸事件的传递机制。
我们知道,只要我们的手指触摸到手机屏幕,就一定会执行dispatchTouchEvent(MotionEvent event)方法,接下来我们就看一下dispatchTouchEvent方法中都有哪些内容:
public boolean dispatchTouchEvent(MotionEvent event) { if (mInputEventConsistencyVerifier != null) { mInputEventConsistencyVerifier.onTouchEvent(event, 0); } if (onFilterTouchEventForSecurity(event)) { //noinspection SimplifiableIfStatement ListenerInfo li = mListenerInfo; if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event)) { return true; } if (onTouchEvent(event)) { return true; } } if (mInputEventConsistencyVerifier != null) { mInputEventConsistencyVerifier.onUnhandledEvent(event, 0); } return false;}
这里我们不细讲Touch事件的分发机制,因为网上有哥们已经讲的很清楚了。请参看篇首提供的链接。
我们看一下第14行,由于我们没有实现OnTouchListener接口,而onTouch()方法的默认返回值为false,所以第一个if语句中的代码不会被执行到,进入第二个if语句中,执行了onTouchEvent()方法。那么我们再来看一下该方法:
public boolean onTouchEvent(MotionEvent event) { // 略去无用代码... if (((viewFlags & CLICKABLE) == CLICKABLE || (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) { switch (event.getAction()) { case MotionEvent.ACTION_UP:// 略去无用代码...if (!mHasPerformedLongPress) { // This is a tap, so remove the longpress check removeLongPressCallback(); // Only perform take click actions if we were in the pressed state if (!focusTaken) { // Use a Runnable and post this rather than calling // performClick directly. This lets other visual state // of the view update before click actions start. if (mPerformClick == null) { mPerformClick = new PerformClick(); } if (!post(mPerformClick)) {performClick(); } } } //略去无用代码..break; } return true; } return false; }
代码太长,我们只看重点,在ACTION_UP这个case当中,我们找到了关键的代码:
if (!post(mPerformClick)) { performClick();}
至此,我们已经基本搞清楚了回调机制的整个过程。
原创文章,可以自由传播,但转载请注明出处。
- Android中回调函数机制解析
- Android中回调函数机制完全解析
- Android回调函数机制
- 详细介绍Android中回调函数机制
- Android中回调函数
- android中回调函数
- Cocos2dx中常用回调函数解析
- 回调函数机制
- 回调函数解析
- 解析--回调函数
- 回调函数解析
- 回调函数解析
- 回调函数解析
- 回调函数解析
- android 中使用回调函数
- Android用户界面中回调函数
- Android中回调函数的使用
- C++ 回调函数 机制
- 检测点2.1
- 使用AlertDialog创建简单的对话框1-显示提示消息的对话框
- SQL语句-Oracle01
- AXIS客户端调用出错org.apache.axis.NoEndPointException
- SQL语句-Oracle02-多表查询
- Android中回调函数机制解析
- 3个线程,分别打印A,B,C,循环打印ABC十次
- 初识JEECG
- 【转载】如何才是Data Scientist?
- SQL-Oracle03-子查询
- 养生3字经
- 颜色跟踪条ColorTrackBar
- Maximum Subarray
- SQL-Oracle04事务处理