异步任务设计模式在OkHttp中的使用
2017-11-24 本文已影响0人
石器时代小古董
一、异步任务模式定义
并行执行多个任务,任务的执行不阻塞其他任务
二、使用场景
1.需要提升多个任务执行的性能
2.任务执行时不互相依赖对方执行的结果
3.减少单个线程运行压力。
4.不希望一个任务长时间等待另一个任务的执行
三、思路
将每一个任务都交给一个线程去执行,任务的启动统一由线程池管理。
四、参考OkHttp异步任务实例
1.定义任务线程对象
public abstract class NamedRunnable implements Runnable {
@Override public final void run() {
·····
execute();
······
}
protected abstract void execute();
}
AsyncCall继承NameRunnable,并且在execute中执行具体的任务。执行的结果通过回调的方式回传给客户端
final class AsyncCall extends NamedRunnable {
private final Callback responseCallback;
AsyncCall(Callback responseCallback) {
super("OkHttp %s", redactedUrl());
this.responseCallback = responseCallback;
}
RealCall get() {
return RealCall.this;
}
@Override protected void execute() {
boolean signalledCallback = false;
try {
......
responseCallback.onFailure(RealCall.this, new IOException("Canceled"));
} else {
.....
responseCallback.onResponse(RealCall.this, response);
}
} catch (IOException e) {
.....
responseCallback.onFailure(RealCall.this, e);
...
} finally {
//Async负责清理Dispatch队列
client.dispatcher().finished(this);
}
}
}
2.定义了执行任务的线程池

3.通过两个队列维护执行对象,保证任务任务最大并发数
private final Deque<AsyncCall> readyAsyncCalls = new ArrayDeque<>();
private final Deque<AsyncCall> runningAsyncCalls = new ArrayDeque<>();
4.每个任务都交给线程池去执行
