okhttp3.OkHttpClient
public class OkHttpClient implements Cloneable, Call.Factory, WebSocket.Factory
Call.Factory 用来发送请求和接收响应
OkHttpClient 使用单例模式能够发挥更好的效果。每一个client 拥有各自的连接池和线程池,复用连接和线程可以降低延迟和减少内存消耗,为每个请求创建client会把资源浪费在闲置的池上。
创建一个默认的OkHttpClient实例:
// The singleton HTTP client.
public final OkHttpClient client = new OkHttpClient();
或者通过OkHttpClient.Builder创建一个自定义的OkHttpClient实例:
// The singleton HTTP client.
public final OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor())
.cache(new Cache(cacheDir, cacheSize))
.build();
定制一个OkHttpClient
OkHttpClient eagerClient = client.newBuilder()
.readTimeout(500, TimeUnit.MILLISECONDS)
.build();
Response response = eagerClient.newCall(request).execute();
通过newBuilder创建的client和原始client共用连接池和线程池,用这种衍生的client来实现特殊的请求,上面的示例就是设置此衍生的client请求超时时间为500,其他配置与原始client相同。
闲置的连接与线程会自动释放,也可以手动释放,调用dispatcher的executorService的shutDown方法。这样后面的所有网络访问也就会被拒绝了。
client.dispatcher().executorService().shutdown();
清空连接池,连接池的守护线程可能不会立即结束。
client.connectionPool().evictAll();
如果client使用了缓存,关闭缓存使用
client.cache().close();
如果关闭缓存之后仍然进行网络请求,会出现异常。
OkHttp的HTTP/2连接也使用了守护线程,当它闲置的时候会自动回收。