OkHttp源码解析之概述

OkHttp源码解析之概述


最近公司项目中使用了不少优秀的开源第三方库,网络请求中则是使用了目前很流行的网络技术方案组合Rxjava+Retrofit+OkHttp,空闲时间先拿OkHttp来开刀,为接下来项目维护做技术准备,也顺便提高一下自己编程设计能力。关于开源网络库OkHttp,官方网站是这样描述的->OkHttp是一个高效的Http客户端,其具备如下的特点:

  • socket自动选择最好路线,并支持自动重连
  • 支持HTTP2/SPDY黑科技
  • 拥有自动维护的socket连接池,减少握手次数
  • *拥有队列线程池,轻松写并发
  • 拥有Interceptors轻松处理请求与响应(比如透明GZIP压缩,LOGGING)
  • 基于Headers的缓存策略

其实说那么多,最主要的是它提供了很好的设计和机制,来帮我们解决网络连接管理,网络数据管理和网络请求异步同步的三大主要问题,这也是我们使用网络一般必须具备的需求,可以让我们省去了很多代码。


OkHttp的简单使用

关于它的使用网上包括它的Sample都有相关代码,这里为了接下来分析的需要,简单的用代码列一下,主要是从它最简单的使用中来挖掘它的相关核心类库,便于从它的源码中找到分析目标。

同步方式

//创建OkHttpClient对象,其更像一个网络请求的管理者
OkHttpClient client = new OkHttpClient();

//创建网络请求对象
Request request = new Request.Builder()
.url(“http://127.0.0.1:8080/test.txt“)
.build();

//通过OkHttpClient对象执行Request对象
Response response = client.newCall(request).execute();
if(response.isSuccessful()){
System.out.println(response.code());
System.out.println(response.body().string());
}

该主要的是这个是通过同步的方式去执行网络请求,而android本身是不允许在UI线程做网络请求操作的,因此这种方式需要我们需要自己开启一个线程去进行网络请求,一般情况下用得相对比较少,毕竟程序员都是比较懒的!!!

异步方式

//创建OkHttpClient对象,其更像一个网络请求的管理者
OkHttpClient client = new OkHttpClient();

//创建网络请求对象
Request request = new Request.Builder()
.url(“http://127.0.0.1:8080/test.txt“)
.build();

//进行异步网络请求,避免使用者再开线程的麻烦
client.newCall(request).enqueue(new Callback(){
//此处进行网络请求的相关结果逻辑
});


从上面的简单代码中,可以看出,就从其暴露出来给开发者使用的类库来说,涉及的主要是以下几个类:
OKHttpClient
Request
Response
Call(execute(),enqueue())

OkHttpClient

毫无疑问,OkHttpClient类肩负着重任,其源码中涉及的主要对象如下:

  final Dispatcher dispatcher;
  final Proxy proxy;
  final List protocols;
  final List connectionSpecs;
  final List interceptors;
  final List networkInterceptors;
  final ProxySelector proxySelector;
  final CookieJar cookieJar;
  final Cache cache;
  final InternalCache internalCache;
  final SocketFactory socketFactory;
  final SSLSocketFactory sslSocketFactory;
  final CertificateChainCleaner certificateChainCleaner;
  final HostnameVerifier hostnameVerifier;
  final CertificatePinner certificatePinner;
  final Authenticator proxyAuthenticator;
  final Authenticator authenticator;
  final ConnectionPool connectionPool;
  final Dns dns;
  final boolean followSslRedirects;
  final boolean followRedirects;
  final boolean retryOnConnectionFailure;
  final int connectTimeout;
  final int readTimeout;
  final int writeTimeout;

从它的源码中涉及的对象属性可以看出,它的类功能涉及了缓存,网络连接,请求分发等等相关内容,不愧为大管家,通过Builder构建者设模式为网络请求增加相关请求设置,很明显它就是我们分析源码的一个重要入口之一了,它的每个构建成分基本上都是实现了该网络库的核心功能,官网上建议把OkHttpClient当做单例对象来使用,它为我们隐藏了大量的代码实现细节。至于Request,Response和Call则在功能上相对单一些。接下来将以OkHttpClient类为分析入口,从网络连接,网络请求任务管理,数据缓存等几方面进行源码分析。

你可能感兴趣的:(Android开发)