Android Okhttp3的使用与运行流程
基本使用
fun okhttp3Demo() { val client: OkHttpClient = OkHttpClient.Builder().build()//创建OkHttpClient val r: Request = Request.Builder().url("").build()//创建Request请求 val call:okhttp3.Call = client.newCall(r)//创建一个Call //添加回调并且添加到等待缓存 call.enqueue(object : okhttp3.Callback { override fun onFailure(call: okhttp3.Call, e: IOException) { } override fun onResponse(call: okhttp3.Call, response: okhttp3.Response) { } }) //call.execute()//直接加入运行缓存 }
运行过程图
Call接口的实现类RealCall
HttpClient调用newCall(r:Request)方法 创建Call的实现类RealCall
@Override public Call newCall(Request request) { return RealCall.newRealCall(this, request, false /* for web socket */); }
跳转到RealCall的newRealCall方法
static RealCall newRealCall(OkHttpClient client, Request originalRequest, boolean forWebSocket) { // Safely publish the Call instance to the EventListener. RealCall call = new RealCall(client, originalRequest, forWebSocket); call.eventListener = client.eventListenerFactory().create(call); return call; }
找到RealCall的enqueue()方法
@Override public void enqueue(Callback responseCallback) { synchronized (this) { if (executed) throw new IllegalStateException("Already Executed"); executed = true; } captureCallStackTrace(); eventListener.callStart(this); //调用了HttpClient的Dispatcher的enqueue方法 此时创建了一个Runable的实现类 AsyncCall client.dispatcher().enqueue(new RealCall.AsyncCall(responseCallback)); }
先看AsyncCall 实现了NamedRunnable接口 NamedRunnable实现了Runnable 其run方法调用了AsyncCall的execute()方法
public abstract class NamedRunnable implements Runnable { protected final String name; public NamedRunnable(String format, Object... args) { this.name = Util.format(format, args); } @Override public final void run() { String oldName = Thread.currentThread().getName(); Thread.currentThread().setName(name); try { execute(); } finally { Thread.currentThread().setName(oldName); } } protected abstract void execute(); }
进入AsyncCall方法的execute()
@Override protected void execute() { try{ //...other //添加interceptors拦截器 责任链 Response response = getResponseWithInterceptorChain(); //...other } finally { client.dispatcher().finished(this); } } Response getResponseWithInterceptorChain() throws IOException { // Build a full stack of interceptors. List<Interceptor> interceptors = new ArrayList<>(); interceptors.addAll(client.interceptors()); interceptors.add(retryAndFollowUpInterceptor); interceptors.add(new BridgeInterceptor(client.cookieJar())); interceptors.add(new CacheInterceptor(client.internalCache())); interceptors.add(new ConnectInterceptor(client)); if (!forWebSocket) { interceptors.addAll(client.networkInterceptors()); } interceptors.add(new CallServerInterceptor(forWebSocket)); Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0, originalRequest, this, eventListener, client.connectTimeoutMillis(), client.readTimeoutMillis(), client.writeTimeoutMillis()); return chain.proceed(originalRequest); }
RealInterceptorChain实现拦截器功能 分别调用拦截器的proceed()方法执行网络请求返回Response
Dispatcher
Call看完接着进入HttpClient的Dispatcher的enqueue方法
//准备中的异步队列 private final Deque<RealCall.AsyncCall> readyAsyncCalls = new ArrayDeque<>(); //执行中的异步队列 private final Deque<RealCall.AsyncCall> runningAsyncCalls = new ArrayDeque<>(); //执行中的同步队列 private final Deque<RealCall> runningSyncCalls = new ArrayDeque<>(); void enqueue(RealCall.AsyncCall call) { synchronized (this) { readyAsyncCalls.add(call); } //处理和执行线程 promoteAndExecute(); } private boolean promoteAndExecute() { assert (!Thread.holdsLock(this)); List<RealCall.AsyncCall> executableCalls = new ArrayList<>(); boolean isRunning; synchronized (this) {//将线程进行缓存处理 for (Iterator<RealCall.AsyncCall> i = readyAsyncCalls.iterator(); i.hasNext(); ) { //从readyAsyncCalls中取出可执行线程并添加到runningAsyncCalls中 并执行线程 RealCall.AsyncCall asyncCall = i.next(); if (runningAsyncCalls.size() >= maxRequests) break; // Max capacity. if (runningCallsForHost(asyncCall) >= maxRequestsPerHost) continue; // Host max capacity. i.remove(); executableCalls.add(asyncCall); runningAsyncCalls.add(asyncCall); } isRunning = runningCallsCount() > 0; } for (int i = 0, size = executableCalls.size(); i < size; i++) { RealCall.AsyncCall asyncCall = executableCalls.get(i); //调用RealCall的executeOn方法 其内部执行 executorService.execute(this);线程池启动线程 asyncCall.executeOn(executorService()); } return isRunning; }
关于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; }