前几天在项目运行中发现 , 我们的项目 Web View 在部分网站播放视频 , 老是播着播着就回到卡住然后从头开始播放 , 一直循环
首先是把无法播放的网址使用浏览器和 pc 进行实验 , 发现是正常的
-
第一个想到的是会不会 http 的问题 , 因为 Android 5 . 0 以上混用 http 和 https 需要另外设置 , 但是检查后发现我们已经设置了 , 而且现在的问题是对于 http 读取的问题而不是无法读取
-
第二个在想会不会是证书问题 , 随后在 onReceivedSslError 中进行处理发现根本没走到里面
-
第三个考虑到会不会是 UA 的问题 , 那个网址对我们的 UA 进行拦截了 ? 更换 UA 发现也不起作用
-
第四个考虑到会不会是我们对于网页的广告拦截操作,误拦截了相关的逻辑 , 在把网站加入白名单后发现还是存在问题
没有头绪的时候,把项目放在那2个小时去忙别的事情,回过头来 , 突然发现 , 网站中的当前时间一直在 2 个小时前 , 很像是被缓存后的结果 , 查看代码发现 , 之前的项目工程师把缓存设置为 LOAD_CACHE_ONLY , 也就是默认强制读取本地缓存。
再去查看无法播放视频的网站 , 发现他们的 ts 像是在线生成的。 例如读取ts 是001.ts 然后002.ts 直到100.ts , 读取一圈后又回到001.ts , 加上这个缓存设置 , 就会默认读取上一次缓存下来的001.ts
解决方案 , 设置 it.cacheMode = WebSettings.LOAD_DEFAULT 即可
简单归纳一下几个模式的区别
-
LOAD_DEFAULT: 默认,根据 cache-control 决定是否从网络上取数据
-
LOAD_NORMAL: API level 17 中已经废弃, 从API level 11开始作用同 LOAD_DEFAULT 模式
-
LOAD_CACHE_ELSE_NETWORK: 只要本地有,无论是否过期,或者 no-cache,都使用缓存中的数据
-
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据
-
LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据