我们常常在开发中会遇到或者听到回调函数,那什么是回调函数呢,根据看了别人的几篇博客后,我在这里写出自己的理解:
所谓回调就是A类中设置一个方法b给对象C,C可以执行A中的方法b。通常这个方法是定义在C对象中的接口中的抽象方法,
A设置的时候直接设置这个接口对象即可。
通常A,b,C的关系是这样的,看下别人的解释,其实是一个道理
接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调
如何定义一个回调
a. 定义接口 : 在类(c)中定义一个Interface, 并在接口中定义一个抽象方法(b);
b. 接口对象 : 在类(c)中定义一个该接口的成员变量;
c. 设置对象 : 在类(c)中定义一个公共的方法(d), 可以设置这个接口的对象, 调用该方法给接口对象成员变量赋值;
d. 调用方法 : 在合适的位置调用接口对象中的方法(a调用b方法);
a. 定义接口 : 在类(c)中定义一个Interface, 并在接口中定义一个抽象方法(b);
b. 接口对象 : 在类(c)中定义一个该接口的成员变量;
c. 设置对象 : 在类(c)中定义一个公共的方法(d), 可以设置这个接口的对象, 调用该方法给接口对象成员变量赋值;
d. 调用方法 : 在合适的位置调用接口对象中的方法(a调用b方法);
具体代码如下
类C
package com.example.interfacetest.cn;
/**
* 接口的回调机制
* 测试的模版类 类似于android中的控件的点击事件
*/
public class Mode {
CallbackTest mCallbackTest;//定义接口的成员变量
public interface CallbackTest {//定义回调的接口和方法
public void function1();
public void function2();
}
/**
* 参数是一个接口
* @param mCallbackTest
*/
public void getInterface(CallbackTest mCallbackTest) {//定义公共方法给接口变量赋值
this.mCallbackTest = mCallbackTest;
}
public void setOnclick() {
mCallbackTest.function1();
}
public void setOnclick2() {
mCallbackTest.function2();
}
}
类A
package com.example.interfacetest.cn;
import com.example.interfacetest.cn.Mode.CallbackTest;
public class MyInterfaceTest {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Mode mode = new Mode();
mode.getInterface(new CallbackTest() {
@Override
public void function2() {
System.out.println("这里是从模版中提取出来的方法---.>>2");
}
@Override
public void function1() {
System.out.println("这里是从模版中提取出来的方法---.>>1");
}
});
//mode.mTest.function1();
mode.setOnclick();
mode.setOnclick2();
}
}
通过接口,我们将大量共通但实现细节不同的方法抽象出来,再去实现它的接口类中具体处理,这样通过接口去调用方法的时候,就可以实现不同的处理,达到复用的效果。
比较常见的是Android中各种按钮的点击事件,再比如fragment间的通信
1、在Fragment中定义接口,申明接口的实例,在onAttach()方法中实现接口实例化为Activity对象
2、在Fragment中的某个方法内,使用接口的实例,调用Activity的方法,向Activity通信
3、Activity实现接口与结构内的方法,实现处理回调的逻辑
参考资料:
http://blog.csdn.net/hack_bug/article/details/7625646
http://blog.csdn.net/wangjinyu501/article/details/22052187 这个是关于Android中的接口回调的理解
这也是小弟对回调机制的一点拙见,有疑问的请留言,如果有错误希望指出!多谢!