前几天在项目运行中发现 , 我们的项目 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: 不使用网络,只读取本地缓存数据
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69917874/viewspace-2997820/ ,如需转载,请注明出处,否则将追究法律责任。