您的位置:首页 > 移动开发 > Android开发

Android的回调

2016-01-01 14:07 302 查看
1、什么是回调?

百度百科的解释:

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

其实很多地方都有个通俗的说法来描述回调:

“场景:小明问妈妈什么时候开饭,妈妈说还要一会儿;小明说那我先去忙其他的,饭好了,电话叫我“;

在这个场景中:电话就是那个函数的指针,指向的是小明;特定的条件就是饭做好了;小明跟妈妈说饭好了,电话叫我,这个是将指针注册到妈妈的函数里;这里隐藏的回调函数就是小明吃饭这个函数,实现方是小明,而调用方是妈妈;

然而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中的回调多见于处理手势,点击等事件,当然还有很多地方有用到,欢迎大家提出来一起讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: