天天看点

OKHTTP(面试二)

1、OkHttp 建立连接的过程,主要涉及到的几个类包括 StreamAllocation、RealConnection 以及 HttpCodec。

2、首先在RetryAndFollowupIntercept 中创建 StreamAllocation 对象,

到 Connection 中创建 RealConnection 和 HttpCodec,

3、OkHttp 中的连接由RealConnection 封装,RealConnection 封装了底层的 Socket,Socket 建立了 TCP 连接,这是需要消耗时间和资源的,而 OkHttp 则使用连接池来管理这里连接,进行连接的重用,提高请求的效率,OkHttp 中的连接池由 ConnectionPool 实现。

4、Http 流的输入输出由 HttpCodec 操作,而 StreamAllocation 则统筹管理这些资源。

5、OkHttp 中的连接池主要就是保存一个正在使用的连接的队列,对于满足条件的同一个 host 的多个连接复用同一个 RealConnection,提高请求效率。此外,还会启动线程对闲置超时或者超出闲置数量的 RealConnection 进行清理。

6.OkHttp内部的组件可以通过put()方法向ConnectionPool中添加RealConnection:

首先判断其否启动了清理线程,如果没有则将 cleanupRunnable 放到线程池中。最后是将 RealConnection 放到队列中;

7、连接池get方法:

从队列中取出一个 Connection 之后,判断其是否能满足重用的要求:

如果这个 Connection 已经分配的数量超过了分配限制或者被标记为不能再分配,则直接返回 false,否则判断 Address 中除了 host 以外的变量是否相同,如果有不同的,那么这个连接也不能重用。

最后就是判断 host 是否相同,如果相同那么对于当前的 Address 来说, 这个 Connection 便是可重用的。

8、清理线程

1、首先统计空闲连接数量;

2、而后通过for循环查找最长空闲时间的连接以及对应空闲时长;

3、而后判断这个最长空闲时间的连接能否超出最大空闲连接数或者者或者者超过最大空闲时间,满足其一则清理最长空闲的连接。假如不满足清除条件,则返回一个对应等待时间。

这个对应等待的时间又分二种情况:

1 有空闲连接:则返回:keepAliveDurationNs-longestIdleDurationNs;

2 没有空闲的连接,则返回:keepAliveDurationNs

注意:清理一个空闲连接后,会返回0,再次立即开始清除。

注意:ConnectInterceptor:负责与服务器建立连接

使用StreamAllocation.newStream来和服务端建立连接,并返回输入输出流(HttpCodec),实际上是通过StreamAllocation中的findConnection寻觅一个可用的Connection,而后调用Connection的connect方法,使用socket与服务端建立连接。

继续阅读