我的应用目前有一个OkHttpClient
(v3.2.0)用于:
- 改造
- 毕加索
- 将图像/视频上传到云媒体服务
- 一个
HttpDataSource
视频使用ExoPlayer
(这里是实现)
我想将OkHttpClients
改造和媒体用例分开使用,因为:
- 我想将他们的缓存分开
- 媒体
OkHttpClient
将有一些Interceptors
改造者不应该有的细节
进行更改后,我为每个实例OkHttpClient
提供了自己的Cache
; 两者都在应用程序的缓存目录中,一个使用 directory http
,一个使用media
. 两个实例的设置方式相同(使用相同的CookieJar
, 和Interceptors
在它们中Builders
;唯一的区别是Cache
传递给它们的实例不同)。缓存与 Picasso 完美配合,但与OkHttpDataSource
.
传递到的 URL 是OkHttpDataSource
我的应用程序服务器上的一个端点,它重定向 (302) 到云媒体服务。这与我们用于图像/毕加索的过程相同,并且效果很好。
我缓存的基本测试步骤是:
- 使用
OkHttpDataSource
播放视频(我的应用程序服务器发回正确的缓存标头) - FC应用程序并重新打开它
- 将设备置于飞行模式
- 使用
OkHttpDataSource
播放视频(即使没有互联网连接也应该播放)
当我使用一个时,OkHttpClient
一切正常。当我如上所述使用两个实例时,来自我的应用程序服务器的响应被缓存(302),但是当它尝试解析Location
标头时,IOException
抛出一个说它无法解析地址。同样,当我只使用一个OkHttpClient
. 此外,当我有 2 个实例时,如果我使用 Retrofit 实例OkHttpDataSource
,缓存工作正常。
我试图通过调试弄清楚发生了什么DiskLruCache
,但遇到了困难,因为附加调试器似乎有副作用。我能够观察到的是,在某些情况下,重定向 URL 的缓存条目被删除,因为它DiskLruCache.Entry.readable
始终设置为false
. 据我所知,这是因为DiskLruCache.completeEdit
被调用了success = false
,但我不确定为什么会这样。同样,仅使用 的一个实例OkHttpClient
或使用 REST 实例而不是媒体实例时,这不是问题OkHttpDataSource
。