1

我的应用目前有一个OkHttpClient(v3.2.0)用于:

  1. 改造
  2. 毕加索
  3. 将图像/视频上传到云媒体服务
  4. 一个HttpDataSource视频使用ExoPlayer这里是实现)

我想将OkHttpClients改造和媒体用例分开使用,因为:

  1. 我想将他们的缓存分开
  2. 媒体OkHttpClient将有一些Interceptors改造者不应该有的细节

进行更改后,我为每个实例OkHttpClient提供了自己的Cache; 两者都在应用程序的缓存目录中,一个使用 directory http,一个使用media. 两个实例的设置方式相同(使用相同的CookieJar, 和Interceptors在它们中Builders;唯一的区别是Cache传递给它们的实例不同)。缓存与 Picasso 完美配合,但与OkHttpDataSource.

传递到的 URL 是OkHttpDataSource我的应用程序服务器上的一个端点,它重定向 (302) 到云媒体服务。这与我们用于图像/毕加索的过程相同,并且效果很好。

我缓存的基本测试步骤是:

  1. 使用OkHttpDataSource播放视频(我的应用程序服务器发回正确的缓存标头)
  2. FC应用程序并重新打开它
  3. 将设备置于飞行模式
  4. 使用OkHttpDataSource播放视频(即使没有互联网连接也应该播放)

当我使用一个时,OkHttpClient一切正常。当我如上所述使用两个实例时,来自我的应用程序服务器的响应被缓存(302),但是当它尝试解析Location标头时,IOException抛出一个说它无法解析地址。同样,当我只使用一个OkHttpClient. 此外,当我有 2 个实例时,如果我使用 Retrofit 实例OkHttpDataSource,缓存工作正常。

我试图通过调试弄清楚发生了什么DiskLruCache,但遇到了困难,因为附加调试器似乎有副作用。我能够观察到的是,在某些情况下,重定向 URL 的缓存条目被删除,因为它DiskLruCache.Entry.readable始终设置为false. 据我所知,这是因为DiskLruCache.completeEdit被调用了success = false,但我不确定为什么会这样。同样,仅使用 的一个实例OkHttpClient或使用 REST 实例而不是媒体实例时,这不是问题OkHttpDataSource

4

1 回答 1

0

OkHttp 的缓存只会存储完整的响应。第一次下载文件时,您是在读取整个响应正文然后在该流上调用 close() 吗?

于 2016-03-25T22:25:40.147 回答