okhttp系列-enqueue过程

1.RealCall.enqueue

java 复制代码
final class RealCall implements Call {
    @Override 
    public void enqueue(Callback responseCallback) {
    synchronized (this) {
        if (executed) throw new IllegalStateException("Already Executed");
        executed = true;
    }
    transmitter.callStart();

    //创建AsyncCall,调用Dispatcher的enqueue
    client.dispatcher().enqueue(new AsyncCall(responseCallback));
  }
}

2.Dispatcher.enqueue

java 复制代码
public final class Dispatcher {
    private final Deque<AsyncCall> readyAsyncCalls = new ArrayDeque<>();

    void enqueue(AsyncCall call) {
        synchronized (this) {
            readyAsyncCalls.add(call); //将call添加到readyAsyncCalls
        }
        promoteAndExecute(); //调用执行的方法
    }
}

3.Dispatcher.promoteAndExecute

java 复制代码
public final class Dispatcher {
    private boolean promoteAndExecute() {
        assert (!Thread.holdsLock(this));

        List<AsyncCall> executableCalls = new ArrayList<>();
        boolean isRunning;
        synchronized (this) {
            //遍历readyAsyncCalls
            for (Iterator<AsyncCall> i = readyAsyncCalls.iterator(); i.hasNext(); ) {
                AsyncCall asyncCall = i.next();
                //如果正在执行的call超过了最大数目64,则不执行
                if (runningAsyncCalls.size() >= maxRequests) break; // Max capacity.

                // Host max capacity.
                //超过了一个主机的最大请求数5
                if (asyncCall.callsPerHost().get() >= maxRequestsPerHost) continue; 

                //从readyAsyncCalls remove
                i.remove();
                asyncCall.callsPerHost().incrementAndGet();
                //添加到executableCalls
                executableCalls.add(asyncCall);
                //添加到runningAsyncCalls
                runningAsyncCalls.add(asyncCall);
            }
            isRunning = runningCallsCount() > 0;
        }

        for (int i = 0, size = executableCalls.size(); i < size; i++) {
            AsyncCall asyncCall = executableCalls.get(i);
            //执行
            asyncCall.executeOn(executorService());
        }

        return isRunning;
    }
}

4.AsyncCall执行

AsyncCall其实是一个Runnable,所以最终执行的是AsyncCall的execute

整个execute()都是在线程里执行的,所以onResponse和onFailure也是在线程触发的

java 复制代码
final class RealCall implements Call {
    @Override 
    protected void execute() {
        try {
            Response response = getResponseWithInterceptorChain();
            //触发callback,返回response
            responseCallback.onResponse(RealCall.this, response);
        } catch (Throwable t) {
            responseCallback.onFailure(RealCall.this, canceledException);
        } finally {
             client.dispatcher().finished(this);//从runningAsyncCalls移除
        }
    }
}

5.总结

  • 创建AsyncCall
  • 将AsyncCall放入readyAsyncCalls
  • 执行

遍历readyAsyncCalls

从readyAsyncCalls移除AsyncCall

将AsyncCall添加到executableCalls

将AsyncCall添加到runningAsyncCalls

遍历executableCalls,执行里面的每一个AsyncCall

相关推荐
苏打水com7 小时前
第六篇:Day16-18 AJAX进阶+接口对接——实现“前后端数据交互”(对标职场“接口开发”核心需求)
css·okhttp·html·js
漏洞文库-Web安全7 小时前
CTFHub XSS通关:XSS-过滤关键词 - 教程
前端·安全·web安全·okhttp·网络安全·ctf·xss
chilavert3181 天前
技术演进中的开发沉思-229 Ajax:Firefox 与 Firebug
javascript·okhttp
chilavert3182 天前
技术演进中的开发沉思-224 Ajax面向对象与框架
javascript·okhttp
chilavert3182 天前
技术演进中的开发沉思-227 Ajax: Ajax 缺陷
javascript·okhttp
by__csdn3 天前
Ajax与Axios终极对比指南全方位对比解析
前端·javascript·ajax·okhttp·typescript·vue·restful
唐古乌梁海3 天前
【AJAX】AJAX详解
前端·ajax·okhttp
q***71016 天前
跨域问题解释及前后端解决方案(SpringBoot)
spring boot·后端·okhttp
自在极意功。9 天前
AJAX 深度详解:从基础原理到项目实战
前端·ajax·okhttp
APIshop11 天前
代码解析:通过第三方爬虫获取1688商品详情接口
爬虫·okhttp