在Android的学习过程中经常会听到或者见到“回调”这个词,那么什么是回调呢?所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需要B类去实现,B类实现该方法后,它本身不会去调用该方法,而是传递给A类,供A类去调用,这种机制就称为回调。
回调函数的使用情景:客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web Service以及Java的RMI都用到回调机制,可以访问远程服务器程序。
( 参考:)
android中好多地方都用到了回调机制,典型的就是各种控件的监听设置:
//定义接口
public interface OnClickListenr{
public void onClick(Button b);
}
//定义Button
public class Button{
OnClickListener mListener;
public void click(){
mListener.onClick(this);
}
public void setOnClickListener(OnClickListener listener){
mListener = listener;
}
}
//将接口对象OnClickListener赋给Button的接口成员
public class Activity{
public Activity(){}
public static void main(String[] args){
Button mButton = new Button();
mButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(Button b){
System.out.println("clicked");
}
});
mButton.click(); //模拟点击事件
}
}
通过这种机制就能很好的解决上述问题,实际实现时,由于回调方法只能监听一个类,而实际情况是每次扫描时就会new一个ScanTask()出来,当时我想的是定义一个静态类型的ScanTask,就可以对其“监听”了
android回调中最常见的是Button的点击事件的回调,这里以此为参照:
1、在A类中定义一个接口:需要我们在类中定义出一个接口,并且给这个接口定义出一个抽象方法,就像下面这样:
public interface CallBack{
public abstract void work()
}
以下是View.java类中定义的响应点击事件的接口:
/**
* Interface definition for a callback to be invoked when a view is clicked.
*/
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
2、在A类中定义出该接口的一个成员变量:
public CallBack mCallBack
以下是View.java类中获取点击事件接口成员变量的源码:
/**
* Listener used to dispatch click events.
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
public OnClickListener mOnClickListener;