天天看点

如何更高效地使用 OkHttp

<b>本文讲的是如何更高效地使用 OkHttp,</b>

<b></b>

转载请联系,并注明出处。

有些响应消息通过包含 <code>Cache-Control</code> HTTP 首部字段允许缓存,但是默认情况下,OkHttp 并不会缓存这些响应消息。因此你的客户端可能会因为不断请求相同的资源而浪费时间和带宽,而不是简单地读取一下首次响应消息的缓存副本。

在可汗学院的应用中,我们指定了 <code>HTTP_RESPONSE_DISK_CACHE_MAX_SIZE</code> 的大小为 <code>10 * 1024 * 1024</code>,即 10MB。

Stetho 不仅能够检查应用的 SQLite 数据库和视图层次,还可以检查 OkHttp 的每一条请求和响应消息:

如何更高效地使用 OkHttp

这种自我检查方式(Introspection)有效地确保了服务器返回允许缓存资源的 HTTP 首部时,且核缓存资源存在时,不再发出任何请求。

开启 Stetho,只用简单地添加一个 <code>StethoInterceptor</code> 实例到网络拦截器(Network Interceptor)的列表中去:

应用运行完毕之后,打开 Chrome 然后跳转到 <code>chrome://inspect</code>。设备、应用以及应用标识符信息会被陈列出来。直接点击“inspect”链接就可以打开开发者工具,然后切换到 Network 标签开始监测 OkHttp 发出的请求。

Retrofit 也有类似的工厂方法用来创建它自己的 <code>OkHttpClient</code>。

图片是应用中需要加载的最大的资源之一。Picasso 是严格地按照 LRU 策略在内存中维护它的图片缓存。如果客户端尝试用 Picasso 加载一张图片,并且 Picasso 没有在内存缓存中找到该图片,那么它会委托内部的 <code>OkHttpClient</code> 实例来加载该图片。在默认情况下,由于前面的 <code>defaultOkHttpClient</code> 方法没有在文件系统中配置响应缓存,该实例会一直从服务器加载图片。

这就需要构建一个用你的 <code>OkHttpClient</code> 配置的 <code>Picasso</code> 实例。如果你在代码中使用 <code>Picasso.with(context).load(...)</code> 来加载图片,你所使用的 <code>Picasso</code> 单例对象,是在 <code>with</code> 方法中用自己的 <code>OkHttpClient</code> 延迟加载和配置的。因此我们必须在第一次调用 <code>with</code> 方法之前指定自己的 <code>Picasso</code> 实例作为单例对象。

简单地把 <code>OkHttpClient</code> 实例包装到一个 <code>OkHttpDownloader</code> 对象中,然后传递给 <code>Picasso.Builder</code> 实例的 <code>downloader</code> 方法:

在 Retrofit 1.9.x 中,通过 <code>RestAdapter</code> 使用你的 <code>OkHttpClient</code> 实例,把 <code>OkHttpClient</code> 实例包装到一个 <code>OkClient</code> 实例中,然后传递给 <code>RestAdapter.Builder</code> 实例的 <code>setClient</code> 方法:

在 Retrofit 2.0 中,直接把 <code>OkHttpClient</code> 实例传递给 <code>Retrofit.Builder</code> 实例的 <code>client</code> 即可。

这个 <code>OkHttpClient</code> 实例随后通过 Dagger 注入到其他用来创建 <code>RestAdapter</code> 和 <code>Picasso</code> 实例的 provider 里。

使用任何你觉得有价值的信息,来创建 <code>User-Agent</code> 值,然后传递给 <code>UserAgentInterceptor</code>的构造函数。我们使用了这些字段:

<code>os</code> 字段,值设置为 <code>Android</code>,明确表明这是一个 Android 设备

<code>Build.MODEL</code> 字段,即用户可见的终端产品的名称

<code>Build.BRAND</code> 字段,即消费者可见的跟产品或硬件相关的商标

<code>Build.VERSION.SDK_INT</code> 字段,即用户可见的 [Android] 框架版本号

<code>BuildConfig.APPLICATION_ID</code> 字段

<code>BuildConfig.VERSION_NAME</code> 字段

<code>BuildConfig.VERSION_CODE</code>字段

小提示:如果你的应用中用到了 <code>WebView</code>,你可以配置使用相同的 <code>User-Agent</code> 值,即之前创建的 <code>UserAgentInterceptor</code>:

在 2.5.0 版本之前,OkHttp 请求默认永不超时。从 2.5.0 版本开始,如果建立了一个连接,或从连接读取下一个字节,或者向连接写入下一个字节,用时超过了10秒,请求就会超时。分别调用 <code>setConnectTimeout</code>,<code>setReadTimeout</code> 或 <code>setWriteTimeout</code> 方法可以重写那些默认值。

小提示:Picasso 和 Retrofit 为它们的默认 <code>OkHttpClient</code> 实例指定不同的超时时长。 默认情况下, Picasso 设定如下:

连接超时15秒

读取超时20秒

写入超时20秒

Retrofit 设定如下:

写入无超时

用你自己的 <code>OkHttpClient</code> 实例配置好 Picasso 和 Retrofit 之后,就能确保所有请求超时的一致性了。

再次强调,OkHttp 的默认配置提供了显著的效果,但是采取以上的措施,可以提高 OkHttp 的可用性和自我检查能力,并且提升你的应用的质量。

<b>原文发布时间为:2016年01月07日</b>

<b>本文来自云栖社区合作伙伴掘金,了解相关信息可以关注掘金网站。</b>

下一篇: TLS 处理

继续阅读