美文网首页
异步任务设计模式在OkHttp中的使用

异步任务设计模式在OkHttp中的使用

作者: 石器时代小古董 | 来源:发表于2017-11-24 16:59 被阅读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.定义了执行任务的线程池

image.png

3.通过两个队列维护执行对象,保证任务任务最大并发数

  private final Deque<AsyncCall> readyAsyncCalls = new ArrayDeque<>();
  private final Deque<AsyncCall> runningAsyncCalls = new ArrayDeque<>();

4.每个任务都交给线程池去执行

image.png

相关文章

网友评论

      本文标题:异步任务设计模式在OkHttp中的使用

      本文链接:https://www.haomeiwen.com/subject/ogqfbxtx.html