定义
Java允许调用接口的方法,但前提是编译时接口的对象必须是一个具体的类,并且实现了接口。
当我们调用接口时,接口的具体子类的具体方法会被调用,这就是回调。
public interface Interface {
void printClassName();
}
public class A implements Interface {
B b = new B();
b.setListener(this);
@Override
public void printClassName() {
System.out.println("This is class A!请告诉我时间");
}
}
public class B {
Interface mInterface;
public void setListener(Interface interface){
this.mInterface = interface;
}
// B 在setListener里面接受到Interface后的某个时刻,执行showPrint
public void showPrint(){
if(mInterface != null){
mInterface.printClassName();
}
}
}
接口回调应用场景:
A:A
B:中间人B
C:C
A new 一个中间人B,并告诉B:如果C想吃饭了就立刻告诉A;
B再注册到C中,时刻监听C。此时C持有B,并可以操作A的方法;
当C觉得饿,想吃饭了,B就告诉A:C想吃饭了;
A根据B的回报,点了外卖。
A:Activity
B:OnClickListener
C:Button
C 中预留有B的专属位置,但为null,即mOnClickListener=null;
public OnClickListener mOnClickListener
在A中new 一个对象B,并嘱咐B一旦C有点击事件,就告诉A;
把B注册到C中,实现对C的监听,此时C中B的专属位置不为null;
Button.setOnClickListener(B)
mOnClickListener=B
C中有点击触发,调用onClick(),也就是接口B中的onClick方法;
mOnClickListener.onClick(this)
B将监听情况告诉个A,A给出相应的动作、行为
OnClickListener() {
@Override
public void onClick(View v) {
//A听到后,发生的动作行为
}
}
让编译器知道,调用接口方法的时候,
去回调我们设置的OnClickListener子类的对应方法,即A中接口的实现类,
new View.OnClickListener() {
@Override
public void onClick(View v) {
// doSth 在这里
}
}
reference : http://www.cnblogs.com/Fndroid/p/5308713.html
如理解有偏差,欢迎指正!