OkHttp 源码解析(1)

项目用到OkHttp,准备研究研究(OkHttp现在很火啊,Retrofit使用OkHttp,Volley支持替换底层http栈为OkHttp,甚至Google的最新源码里,都用起了OkHttp,替换了原来用的HttpClient)。

OkHttp在网络有问题的时候表现很好:
  • 它会静默从常见的连接问题中恢复。

  • 如果你的服务有多个IP地址对应,OkHttp会在首次连接失败的时候尝试其他地址。

  • OkHttp使用现代的TLS features (SNI, ALPN) 来初始化连接, 并在握手失败的时候倒回到TLS 1.0。

具体如何使用就不啰嗦了,网上很多教程,直接进源码

OkHttpClient
  • 请求的工厂,用它可以发送Http请求和就收返回信息。主要是Http相关那些东西的配置。

  • 初始化两个数组

  private static final List<Protocol> DEFAULT_PROTOCOLS = Util.immutableList(
      Protocol.HTTP_2, Protocol.HTTP_1_1);
  private static final List<ConnectionSpec> DEFAULT_CONNECTION_SPECS = Util.immutableList(
      ConnectionSpec.MODERN_TLS, ConnectionSpec.COMPATIBLE_TLS, ConnectionSpec.CLEARTEXT);
  • 初始化Intelnal单例,提供给各处使用
  static {
        Internal.instance = new Internal() {
            // 实现各个抽象方法
        }
  }
  • 懒加载
private static SSLSocketFactory defaultSslSocketFactory;
  • 多个IP时候的选择策略
private final RouteDatabase routeDatabase;
  • 异步请求执行时候的策略,用到了ExecutorService作线程池,默认创建的是core 0,max Integer.MAX_VALUE,keep alive 60秒的线程池
private Dispatcher dispatcher;
  • 代理,分为DIRECT(直连无代理)、HTTP和SOCKS
private Proxy proxy;   
  • 拦截器 - 在Response正式返回前处理数据,比如Gzip解压
private final List<Interceptor> interceptors = new ArrayList<>();
  • 这个网络拦截器可就牛逼了。。。相较前面那个发生地更早,在HttpEngine的readResponse中被调用
    可以做诸如CheckHandshake初始化的时候加进去了一个握手的拦截器去检查是否在黑名单;LoggingInterceptors则加了一个log的拦截器,输出请求和response的信息;Progress加了个包装response的拦截器,来增加progress功能;RewriteResponseCacheControl直接重写server的cache控制头
private final List<Interceptor> networkInterceptors = new ArrayList<>();
private ProxySelector proxySelector;
private CookieHandler cookieHandler;

/* Non-null if this client is caching; possibly by {@code cache}. /

  private InternalCache internalCache;
  private Cache cache;

  private SocketFactory socketFactory;
  private SSLSocketFactory sslSocketFactory;
  private HostnameVerifier hostnameVerifier;
  private CertificatePinner certificatePinner;
  private Authenticator authenticator;
  private ConnectionPool connectionPool;
  private Network network;
OkHttpClient 的一些方法
  • newCall(Request request) //Prepares the request to be executed at some point in the future.
  @Override public Call newCall(Request request) {
    return new RealCall(this, request, false /* for web socket */);
  }

为将来发送请求做准备,这样Request、 OkHttpClient 就传递到了到RealCall中,我们需要做的是创建OkHttpClient、Request 通过OkHttpClient的newCall方法将OkHttpClient、Request存放到RealCall中,接着调用RealCall的execute执行同步请求,或者调用enqueue方法执行异步操作。

接下来会继续探究Request,Response,Call,Dispatche…
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值