以上只是Okhttp最简单的流程分析
标签:
Okhttp源码分析--根基使用流程分析 一、 使用 同步请求 OkHttpClient okHttpClient=new OkHttpClient(); Request request=new Request.Builder() .get() .url("") .build(); Call call =okHttpClient.newCall(request).execute(); 异步请求 OkHttpClient okHttpClient=new OkHttpClient(); Request request=new Request.Builder() .get() .url("") .build(); Call call=okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.i(TAG, "onFailure: "); } @Override public void onResponse(Call call, Response response) throws IOException { Log.i(TAG, "onResponse: "); } });可以看出不管是同步还是异步请求,使用okhttp大抵分为3个法式:
1. 创建okhttpclient
2. 创建请求的request
3. 通过client拿到call、发送请求
注:okhttpclient和request的创建均可给与结构者模式,在结构过程中可按照本身的实际需求设置相应的参数,如可在okhttpclient结构时添加自界说拦截器,在request结构过程中设置连接超不时间等。
二、 源码分析首先看下OkhttpClient这个类,使用法式的第一步就是结构OkhttpClient东西。
先贴下官方对OkhttpClient的界说
*Factory for {@linkplain Call calls}, which can be used to send HTTP requests and read their * responses. * OkHttpClients should be shared * OkHttp performs best when you create a single {@code OkHttpClient} instance and reuse it for * all of your HTTP calls. This is because each client holds its own connection pool and thread * pools. Reusing connections and threads reduces latency and saves memory. Conversely, creating a * client for each request wastes resources on idle pools.OkhttpClient是用于发送请求和读取响应的,官方建议创建一个单例的OkHttpClient,并且所有的http请求都复用它。因为每个OkHttpClient都有本身的connection pool and thread pool。复用connection pool and thread pool可以节约内存,相反如果为每个请求都创建一个OkHttpClient那么会浪费idle pools中的资源。
创建OkHttpClient有两种方法:
1、通过结构函数
2、通过Builder()创建一个client并自界说设置
同时还供给了一个newBuilder()来自界说client,它跟共享的client拥有不异的connection pool, thread pools, and configuration。我们可以用该要领来获取特定设置的client。
OkHttpClient供给无参结构函数,由代码可知它在内部挪用OkHttpClient的有参结构函数
,在有参结构函数里对OkHttpClient主要属性做了初始化赋值。
下面贴下OkHttpClient主要的属性
public class OkHttpClient{ final Dispatcher dispatcher;//分发器 final @Nullable Proxy proxy;//代办代理 final List<Protocol> protocols;//协议 final List<ConnectionSpec> connectionSpecs;//传输层版本和连接协议 final List<Interceptor> interceptors;//拦截器 (okhttp核心机制) final List<Interceptor> networkInterceptors;//网络拦截器 final EventListener.Factory eventListenerFactory; final ProxySelector proxySelector;//代办代理选择器 final CookieJar cookieJar;//cookie final @Nullable Cache cache;//cache 缓存 final @Nullable InternalCache internalCache;//内部缓存 final SocketFactory socketFactory;//socket 工厂 final @Nullable SSLSocketFactory sslSocketFactory;//安适套层socket工厂 用于https final @Nullable CertificateChainCleaner certificateChainCleaner;//验证确认响应书,适用HTTPS 请求连接的主机名 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;//写入超不时间 }通过浏览源码我们可以发明OkHttpClient给与了结构者设计模式,这样简化参数设置,降低使用本钱。好比我们前面简单使用的例子
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/33177.html