okhttp系列-一些上限值

1.正在执行的任务数量最大值是64

异步请求放入readyAsyncCalls后,遍历readyAsyncCalls取出任务去执行的时候,如果发现runningAsyncCalls的数量大于等于64,就不从readyAsyncCalls取出任务执行。

java 复制代码
public final class Dispatcher {
    private int maxRequests = 64;

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

    private boolean promoteAndExecute() {
    assert (!Thread.holdsLock(this));

    List<AsyncCall> executableCalls = new ArrayList<>();
    boolean isRunning;
    synchronized (this) {
      for (Iterator<AsyncCall> i = readyAsyncCalls.iterator(); i.hasNext(); ) {
        AsyncCall asyncCall = i.next();
        //如果超过了最大数目
        if (runningAsyncCalls.size() >= maxRequests) break; // Max capacity.

        if (asyncCall.callsPerHost().get() >= maxRequestsPerHost) continue; // Host max capacity.
        //从readyAsyncCalls remove
        i.remove();

        //callsPerHost+1
        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;
  }
}

2.同一个主机的最大连接数为5

异步请求放入readyAsyncCalls后,遍历readyAsyncCalls取出任务去执行的时候,如果发现asyncCall的callsPerHost大于等于5,就不从readyAsyncCalls取出任务执行;否则callsPerHost加1。

java 复制代码
public final class Dispatcher {
    private int maxRequestsPerHost = 5; //默认5。这是okhttp对同一主机允许的最大请求数量。

    void enqueue(AsyncCall call) {
        synchronized (this) {
            readyAsyncCalls.add(call);

            //Mutate the AsyncCall so that it shares the AtomicInteger 
            //of an existing running call to the same host.
            if (!call.get().forWebSocket) {
                //从已经存在的任务里面找同一个主机的任务
                AsyncCall existingCall = findExistingCallWithHost(call.host());
                if (existingCall != null) {
                    //call的将callsPerHost赋值为existingCall的callsPerHost
                    call.reuseCallsPerHostFrom(existingCall);
                }
            }
        }
        promoteAndExecute();
    }

    //有个疑问,这里是不是要从ArrayDeque尾向前获取,才能获取到最新的AsyncCall,这样获取到的
    //callsPerHost才会是最大的?
    //目前从头开始获取,是不是有问题?
    //先从runningAsyncCalls找,再从readyAsyncCalls找
    @Nullable 
    private AsyncCall findExistingCallWithHost(String host) {
        for (AsyncCall existingCall : runningAsyncCalls) {
            if (existingCall.host().equals(host)) {
                return existingCall;
            }
        }
        for (AsyncCall existingCall : readyAsyncCalls) {
            if (existingCall.host().equals(host)) {
                return existingCall;
            }
        }
        return null;
    }
}
相关推荐
Dxy12393102164 天前
Ajax如何发送列表数据
前端·ajax·okhttp
96775 天前
AJAX和Axios理解和关系
前端·ajax·okhttp
必胜刻7 天前
AJAX 请求理解
前端·ajax·okhttp·前后端交互
android_cai_niao7 天前
OkHttp 使用教程:从入门到精通(Kotlin)
okhttp·kotlin
qwert103714 天前
跨域问题解释及前后端解决方案(SpringBoot)
spring boot·后端·okhttp
符哥200816 天前
基于 OkHttp+Retrofit 实现 JSON / 表单 / XML/Protobuf 数据格式全解析
okhttp·json·retrofit
XiaoLeisj17 天前
Android 网络编程入门到实战:HttpURLConnection、JSON 处理、OkHttp 与 Retrofit2
android·网络·okhttp·json·gson·retrofit2·jsonobjecy
凯鑫BOSS18 天前
Pbootcms查看详细报错信息
okhttp
vistaup2 个月前
OKHTTP 默认构建包含 android 4.4 的TLS 1.2 以及设备时间不对兼容
android·okhttp