OkHttp之OkHttpClient

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cdye_1234/article/details/80267931

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连接也使用了守护线程,当它闲置的时候会自动回收。

展开阅读全文

没有更多推荐了,返回首页