WebView不会缓存

3

我一直在尝试启用Android WebView中的缓存,但是我在SO上看到的每个配置都以失败告终。

这是我的情况:

我有一个网页,其中包含一个Iframe,在循环中加载10-12个页面,所有这些页面中的所有内容都具有Cache-Control: max-age = 86400标头。

如果我在浏览器中正常加载这些页面,它们可以工作并且页面已被缓存。

所以这里是我的配置:

        getSettings().setJavaScriptEnabled(true);
        getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        getSettings().setDomStorageEnabled(true);
        getSettings().setMediaPlaybackRequiresUserGesture(false);
        getSettings().setAppCacheEnabled(true);
        getSettings().setAppCachePath(context.getCacheDir().getAbsolutePath());
        getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);

这些设置适用于媒体播放和启用js。
编辑:
我构建了一个新应用程序,并尝试使用loadUrl方法加载谷歌,然后在没有网络的情况下使用按钮重新加载该页面,它能够在没有互联网的情况下重新加载该页面,这意味着它缓存了该页面。
因此问题在于webview没有缓存正在被页面加载的页面。
如果有人知道如何缓存通过webview加载的内容,那将是一个很大的帮助。
-谢谢
2个回答

1
经过对我们的 iframe 和 Android 设备进行一系列详细测试后,我意识到 WebView 不会缓存超过特定大小的文件。其中一个页面由 iframe 加载,其中包含一个大小为 30MB 的视频,无法被缓存,导致数据消耗巨大(因为每 2 分钟就要渲染一次)。我将其缩小到 10MB,仍然无法缓存,最后将其缩小到 980KB,才开始缓存。
我不确定 WebView 每个文件的缓存限制是多少,但我发现一个有趣的 bug here,它指出在 Android 4.3 之后,总缓存限制被硬编码为 20MB,在这个 file 中的第 98 行可以找到。
如果有人知道这些限制的文档,请在此回复让社区知道。

那么你的答案是减小文件大小吗?如果这不是一个选择,你找到了其他的替代方案吗? - undefined
@c_rueschenberg 如果是这样的话,那么在更改源文件中设置的硬限制后,您必须重新构建Chromium并使用该构建。请检查我回答中的文件链接,其中显示了硬限制。 - undefined

1
这段代码解决了我的问题,希望对你也有帮助:
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

编辑:另外,你不需要这些行:

getSettings().setAppCacheEnabled(true);

 getSettings().setAppCachePath(context.getCacheDir().getAbsolutePath());

移除它们并再次检查。 AppCache 设置与您想要的缓存类型无关。


好的,还有一件事,我正在使用Android 5版本,这会对配置产生任何影响吗? - undefined
我面临的问题是,如果有网络连接,LOAD_CACHE_ELSE_NETWORK不管缓存是否存在都不使用缓存。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接