回调的核心就是回调方将自己本身传递给调用方,这样调用方可以再调用结束以后告诉回调方它需要的 信息。 一般来说项目开发过程中存在下面三种模块间调用方式 1 同步调用 类
回调的核心就是回调方将自己本身传递给调用方,这样调用方可以再调用结束以后告诉回调方它需要的
信息。
一般来说项目开发过程中存在下面三种模块间调用方式
1 同步调用
类A方法a()调用类B方法b(),a()必须等待b()执行完毕才能继续执行。如果b()一直阻塞或者执行时间长
的话,a()后面的流程也会造成相应阻塞。
2 异步调用
为了处理上面的异常情况,类A的方法a()可以通过新建一个线程来调用b(),这样b()的执行时间就不会
对a()产生影响。但是如果a()需要用到b()的返回结果时,必须通过一定方法对b()的返回结果进行监听
。我们这里不讨论这种情况。
3 回调
接上面,我们可以考虑b()执行完毕后主动调用类A的callback()方法,这就是回调。
示例:类classA的ask()调用类ClassB的answerQues(),answerQues()中执行完毕后,主动调用callback
()方法answer()返回classA。
Callback.java
public interface Callback {public void answer(String name);
}
ClassA.java
public class ClassA implements Callbackprivate ClassB classB;
public ClassA(ClassB classB) {
this.classB = classB;
}
public ClassB getClassB() {
return classB;
}
public void setClassB(ClassB classB) {
this.classB = classB;
}
public void ask(){
new Thread(new Runnable(){
@Override
public void run() {
classB.answerQues(ClassA.this);
}
}).start();
//去做其他事
doOtherThing();
}
public void doOtherThing(){
System.out.println("A做其他事情!");
}
@Override
public void answer(String name) {
System.out.println("答案是:"+name);
}
}
ClassB.java
public interface ClassB {public void answerQues(Callback callback);
}
ClassBImpl.java
public class ClassBImpl implements ClassB@Override
public void answerQues(Callback callback) {
try {
System.out.println("B做其他事情!");
//假装在做其他事
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//!!!回调
callback.answer("100");
}
}
CallbackTest.java
public static void main(String[] args) {ClassB classB = new ClassBImpl();
ClassA classA = new
执行结果:
A做其他事情!B做其他事情!
答案是:100
有两个优点:1 对classA抽象化,对于classB来说,不需要关心classA的具体实现。2 对于classB抽象
化,classA不需要关心classB的具体实现。即classA和classB中间出现一个池,classA放入东西,
classB取出东西,classB执行完成后调用classA,继续后面工作。
回调的核心就是回调方将自己本身传递给调用方,这样调用方可以再调用结束以后告诉回调方它需要的
信息。