关于OkHttp3之前用的时候没有考虑过它的内部实现过程,今天在这里整理记录一下。
接下来我会将OkHttpClient类中常用的方法,内部类、字段加上自己理解的注释,通过看注释了解OkHttpClient的主要用途。
public class OkHttpClient implements Cloneable, Call.Factory, WebSocket.Factory {
//OkHttp默认支持的协议Http1.1和OkHttp2
static final List<Protocol> DEFAULT_PROTOCOLS = Util.immutableList(
Protocol.HTTP_2, Protocol.HTTP_1_1);
//默认的连接规则
static final List<ConnectionSpec> DEFAULT_CONNECTION_SPECS = Util.immutableList(
ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT);
static {
/*这个类对象的主要用途是操作连接池类,这样做保证了唯一性。*/
Internal.instance = new Internal() {
//设置OkHttpClient的内部缓存
@Override public void setCache(OkHttpClient.Builder builder, InternalCache internalCache) {
builder.setInternalCache(internalCache);
}
//连接池判断指定的连接是否空闲,如果空闲则清除指定连接,否则扫描连接池有无到期的空闲连接。
@Override public boolean connectionBecameIdle(
ConnectionPool pool, RealConnection connection) {
return pool.connectionBecameIdle(connection);
}
//获得连接池中和本次连接的URL相同的连接
@Override public RealConnection get(ConnectionPool pool, Address address,
StreamAllocation streamAllocation, Route route) {
return pool.get(address, streamAllocation, route);
}
//比较两个地址的非主机部分(DNS、协议、连接规则等)
@Override public boolean equalsNonHost(Address a, Address b) {
return a.equalsNonHost(b);
}
//主要针对HTTP2的多路复用,复用连接池中是Http2的连接并且要符合address要求。
@Override public Socket deduplicate(
ConnectionPool pool, Address address, StreamAllocation streamAllocation) {
return pool.deduplicate(address, streamAllocation);
}
//将连接放入连接池,并扫描连接池有无到期的空闲连接
@Override public void put(ConnectionPool pool, RealConnection connection) {
pool.put(connection);
}
//获得相应码
@Override public int code(Response.Builder responseBuilder) {
return responseBuilder.code;
}
//构造HttpUrl,构造方式是检查URL有无语法错误,有则抛出异常,没有则肢解URL给HttpUrl。
@Override public HttpUrl getHttpUrlChecked(String url)
throws