在 Android 的学习过程中遇到了回调函数,经过一段时间的理解,将自己的收获整理如下,希望对迫切希望了解这方面知识的同学有所启发。

回调函数的理解如下:

  1. 在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需要B类去实现,B类实现该方法后,它本身不会去调用该方法,而是传递给A类,供A类去调用,这种机制就称为回调。
  2. 使用某一接口的实现类创建对象的引用赋值给该接口声明的接口变量,也就是多态的体现方式,那么这个接口变量就可以调用被类实现的接口的方法;通常开发过程中,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调

哈哈,是不是被上面的定义整蒙了,不要急,看完下面的代码后,再去看一遍这些冠冕堂皇的话^_^

我们设想一个场景:一位同学去找老师,想知道自己的数学成绩是多少,老师告诉他,现在成绩还没有出来,你可以先留下电话号码,成绩一旦出来,我马上电话告知你,学生留下电话走了,等了几天成绩出来了,老师找到该同学的电话号码,告诉他成绩很不错。

——在上面的场景中,电话号码就是回调函数,老师打电话就是在调用回调函数——

A(Student)类构成如下:

public class Student {

    //定义回掉接口的成员变量
    private CallBack callBack;  
    //声明回调接口
    public interface CallBack{
        void work();
    }   
    //设置回调接口对象成员变量
    public void setCallBack(CallBack c){
        this.callBack = c;
    }   
    //调用回调接口对象中的方法
    public void doWork(){
        callBack.work();
    }
}

B(Teacher)类如下:

public class Teacher {
    public static void main(String[] args) {
        // TODO Auto-generated method stub  
        Student stu = new Student();
        //(B类)设置接口对象,实现未实现的方法
        stu.setCallBack(new CallBack() {            
            @Override
            public void work() {
                // TODO Auto-generated method stub
                System.out.println("你的成绩出来了,考的不错!");                
            }
        });
        //(A类)实现方法的调用
        stu.doWork();
    }
}

如上便是回调函数的整个实现过程。

总结如下:为了实现方法的回调,需要定义一个A类,这个类中含有一个接口,接口中有未实现的方法,同时需要在本类中创建函数,这个函数来获取接口实例,还需要一个函数,来使用接口实例调用接口未实现的方法(此处不去实现)。在另一B类中,维护一个A类实例,使用A类实例调用A类中相应方法,来设置接口对象,实现未实现的方法,然后在B类中使用A类实例调用A类中的另一个方法,完成方法的回调

参考文档:
1. 马剑威-接口回调机制
2. 回调函数是什么?
3. Android回调函数机制那点事