一、同步调用
同步调用是最基本的调用方式。类A的a()方法调用类B的b()方法,类A的方法需要等到B类的方法执行完成才会继续执行。如果B的方法长时间阻塞,就会导致A类方法无法正常执行下去。
二、异步调用
如果A调用B,B的执行时间比较长,那么就需要考虑进行异步处理,使得B的执行不影响A。通常在A中新起一个线程用来调用B,然后A中的代码继续执行。
异步通常分两种情况:
- 第一,不需要调用结果,直接调用即可,比如发送通知;
- 第二,需要异步调用结果,在Java中可使用Future+Callable实现。
三、回调
通常回调分为:同步回调和异步回调。
其中同步回调与同步调用类似,代码运行到某一个位置的时候,如果遇到了需要回调的代码,会在这里等待,等待回调结果返回后再继续执行。
异步回调与异步调用类似,代码执行到需要回调的代码的时候,并不会停下来,而是继续执行,当然可能过一会回调的结果会返回回来。
1、同步回调
制作Callback接口
public interface Callback {
void CallbackData(String Data);
}
自定义向小明提问的人:
public class CallbackHanler implements Callback{
Caller caller;
public CallbackHanler(Caller caller) {
this.caller = caller;
}
@Override
public void CallbackData(String Data) {
Log.d("TAG!","你懂了,答案为"+Data);
}
public void ask(){
caller.DoWork(this);
}
}
大佬小明:
public class Caller {
public void DoWork(Callback callback){
Log.d("TAG!","小明进行自己的工作");
try {
Thread.sleep(5000);
Log.d("TAG!","开始解决你的问题");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
Log.d("TAG!","问题答案为2");
//传递问题答案
callback.CallbackData("2");
}
}
在Main函数中调用这两个类:
Caller caller = new Caller();
CallbackHanler callbackHanler = new CallbackHanler(caller);
callbackHanler.ask();
Log.d("TAG!","你在等待。。。。");
打印结果如下:
上面的实例演示了同步回调,很明显在调用的过受到Caller
执行时长的影响,需要等到Caller
处理完才能继续执行CallbackHanler
方法中的后续代码。
2、异步回调
修改CallbackHanler的ask()方法如下:
public void ask(){
new Thread(()-> caller.DoWork(this)).start();
}
打印结果如下:
通过Main函数的Log.d(“TAG!”,“你在等待。。。。”);可以知道,此时main函数没有等待ask(),而是直接继续执行。