Android Webview 的 ClearCache 很慢
Posted
技术标签:
【中文标题】Android Webview 的 ClearCache 很慢【英文标题】:Android Webview's ClearCache is very slow 【发布时间】:2013-01-01 18:41:59 【问题描述】:我在 android 应用中使用 WebView,我需要防止 WebView 缓存。
不幸的是,这个看似简单的目标似乎几乎不可能实现。我使用的解决方案是在 onPageFinished 事件中执行 webview.clearCache(true) ,以便在每次加载页面时清除缓存。有一些问题...
我注意到随着缓存的增长,执行 clearCache 方法变得非常耗时。有时如果你执行 clearCache 然后切换到包含不同 webview 的不同 Activity,该 webview 将不会加载几秒钟,因为它仍在等待之前的 clearCache 操作完成。
更糟糕的是,在清除缓存后,后续调用 clearCache 的执行时间似乎并没有减少。如果对 clearCache 的调用需要 3 秒才能完成,然后我立即第二次调用 clearCache,那么我希望对 clearCache 的第二次调用几乎立即完成。但这不是我正在经历的;我遇到第二次调用 clearCache 仍然需要大约 3 秒。
有其他人经历过吗?有什么方法可以提高性能吗?等待 2-3 秒加载 web 视图(从本地文件系统)是可怕的。
编辑:
这是我实际清除缓存的最佳选择。它或多或少有效,但有点不稳定,我对它不是 100% 满意(用 Mono c# 编写):
public class NoCacheWebClient : WebViewClient
string previous;
public override void OnPageStarted(WebView view, string url, Android.Graphics.Bitmap favicon)
base.OnPageStarted(view, url, favicon);
if (!string.Equals(previous, url))
previous = url;
view.Reload(); //re-load once to ignore cache
else
previous = null;
【问题讨论】:
【参考方案1】:1) 尝试使用setAppCacheEnabled 和setAppCacheMaxSize 将缓存大小限制为非常小,较小的缓存大小将导致更快的清理。
例如:wv.getSettings().setAppCacheMaxSize(1);
或
2) 如果您不需要缓存数据,则只需设置 setCacheMode(WebSettings.LOAD_NO_CACHE); ,这意味着 “不要使用缓存,从网络加载”,即使数据已缓存。
简而言之,只需忽略缓存的数据,android 就会处理它。
或
3) 你也可以试试下面的无缓存代码,
注意:这仅适用于 Android API 8+
Map<String, String> noCacheHeaders = new HashMap<String, String>(2);
noCacheHeaders.put("Pragma", "no-cache");
noCacheHeaders.put("Cache-Control", "no-cache");
view.loadUrl(url, noCacheHeaders);
或
4) 每次页面加载完成时都清除缓存。
WebViewClient
中的类似内容。
@Override
public void onPageFinished(WebView view, String url)
super.onPageFinished(view, url);
view.clearCache(true);
或
5) 您可以尝试一次删除整个缓存数据库。
context.deleteDatabase("webview.db");
context.deleteDatabase("webviewCache.db");
这可能会产生更快的结果,希望如此。
【讨论】:
感谢您的回复。我已经尝试了所有这些,但没有一个能很好地工作。另外我认为 setCacheMode、setAppCacheEnabled 和 setAppCacheMaxSize 是用于 html5 API 缓存,而不是一般的缓存。 noCacheHeaders.put("Pragma", "no-cache");很有希望,但我相信它只适用于您正在加载的基本页面;如果该页面包含其他资源(例如图像),则 no-cache 将不会应用于这些资源,只会应用于基本页面。在这种情况下,图像仍将被缓存,并且如果文件已更改,则会显示错误的内容。我想我可以用 WebViewClient.shouldInterceptRequest() 解决这个问题,但它是 API 级别 11+,我需要针对 API 级别 8+ 看看 onLoadResource(WebView view, String url) 或 shouldOverrideUrlLoading(WebView view, String url) 作为 WebViewClient.shouldInterceptRequest() 的替代方案。 谢谢。 shouldOverrideUrlLoading 仅在加载请求由用户操作触发时调用,例如单击链接。它不适用于其他类型的资源,例如嵌入在 HTML 页面中的纯图像。当 onLoadResource 被调用时,来不及取消或修改请求。【参考方案2】:当您要进行下一项活动时,请完成上一项活动。这样您就可以释放该活动占用的所有内存。 希望这会有所帮助。
【讨论】:
谢谢。我已经尝试完成活动,但清除缓存所需的时间仍然相同(3-4 秒)。似乎只有在我强制停止应用程序后,清除缓存的时间才会重置为合理的时间(几毫秒)。以上是关于Android Webview 的 ClearCache 很慢的主要内容,如果未能解决你的问题,请参考以下文章