您的当前位置:首页正文

Android-回调机制

2024-11-07 来源:个人技术集锦

在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;
Top