前言
学会了OkHttp3的用法后,我们当然有必要来了解下OkHttp3的源码,当然现在网上的文章很多,我仍旧希望我这一系列文章篇是最简洁易懂的。
1.从请求处理开始分析
首先OKHttp3如何使用这里就不在赘述了,不明白的同学可以查看Android网络编程(5):OkHttp2.x用法全解析、
Android网络编程(6):OkHttp3用法全解析这两篇文章。当我们要请求网络的时候我们需要用OkHttpClient.newCall(request)进行execute或者enqueue操作,当我们调用newCall时:
1 2 3 |
@Override public Call newCall(Request request) { return new RealCall(this, request); } |
实际返回的是一个RealCall类,我们调用enqueue异步请求网络实际上是调用了RealCall的enqueue方法:
1 2 3 4 5 6 7 |
void enqueue(Callback responseCallback, boolean forWebSocket) { synchronized (this) { if (executed) throw new IllegalStateException("Already Executed"); executed = true; } client.dispatcher().enqueue(new AsyncCall(responseCallback, forWebSocket)); } |
可以看到最终的请求是dispatcher来完成的。
2.Dispatcher任务调度
主要的变量
Dispatcher主要用于控制并发的请求,它主要维护了以下变量:
1 2 3 4 5 6 7 8 9 10 11 12 |
/** 最大并发请求数*/ private int maxRequests = 64; /** 每个主机最大请求数*/ private int maxRequestsPerHost = 5; /** 消费者线程池 */ private ExecutorService executorService; /** 将要运行的异步请求队列 */ private final Deque<AsyncCall> readyAsyncCalls = new ArrayDeque<>(); /**正在运行的异步请求队列 */ private final Deque<AsyncCall> runningAsyncCalls = new ArrayDeque<>(); /** 正在运行的同步请求队列 */ private final Deque<RealCall> runningSyncCalls = new ArrayDeque<>(); |
构造函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public Dispatcher(ExecutorService executorService) { this.executorService = executorService; } public Dispatcher() { } public synchronized ExecutorService executorService() { if (executorService == null) { executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp Dispatcher", false)); } return executorService; } |
Dispatcher有两个构造函数,可以使用自己设定线程池,如果没有设定线程池则会在请求网络前自己创建线程池,这个线程池类似于CachedThreadPool比较适合执行大量的耗时比较少的任务。不了解线程池的同学可以查看Android多线程(一)线程池这篇文章。其中用到了SynchronousQueue,不了解它的同学可以查看Java并发编程(六)阻塞队列这篇文章。
异步请求
1 2 3 4 5 6 7 8 |
synchronized void enqueue(AsyncCall call) { if (runningAsyncCalls.size() < maxRequests && runningCallsForHostingAsyncCalls.size() < maxRequests && runningCallsForHostid.jobbole.com/84248/">Android网络编程(4):从源码解析volley
前言学会了OkHttp3的用法后,我们当然有必要来了解下OkHttp3的源码,当然现在网上的文章很多,我仍旧希望我这一系列文章篇是最简洁易懂的。 1.从请求处理开始分析首先OKHttp3如何使用这里就不在赘述了,不明白的同学可以查看Android网络编程(5):OkHttp2.x用法全解析、
实际返回的是一个RealCall类,我们调用enqueue异步请求网络实际上是调用了RealCall的enqueue方法:
可以看到最终的请求是dispatcher来完成的。 2.Dispatcher任务调度主要的变量Dispatcher主要用于控制并发的请求,它主要维护了以下变量:
构造函数
Dispatcher有两个构造函数,可以使用自己设定线程池,如果没有设定线程池则会在请求网络前自己创建线程池,这个线程池类似于CachedThreadPool比较适合执行大量的耗时比较少的任务。不了解线程池的同学可以查看Android多线程(一)线程池这篇文章。其中用到了SynchronousQueue,不了解它的同学可以查看Java并发编程(六)阻塞队列这篇文章。 异步请求
|