我正在android应用程序中使用webviews,我需要防止webviews缓存。
不幸的是,看起来这个看似简单的目标几乎不可能实现。我使用的解决方案是在onpagefinished事件中执行webview.clearcache(true),以便每次加载页面时清除缓存。有一些问题…
我注意到,随着缓存的增长,clearcache方法的执行变得非常耗时。有时,如果执行clearcache,然后切换到包含不同webview的不同活动,则该webview在几秒钟内不会加载,因为它仍在等待上一个clearcache操作完成。
更糟糕的是,在清除了缓存之后,对clearcache的后续调用的执行时间似乎并没有减少。如果对clearcache的调用需要3秒才能完成,然后我立即第二次调用clearcache,那么我希望对clearcache的第二次调用几乎立即完成。但这并不是我正在经历的;我正在经历第二次调用clearcache仍然需要大约3秒。
还有人经历过吗?有什么方法可以提高性能吗?等待2-3秒(从本地文件系统)加载webview是很可怕的。
编辑:
这是我实际清除缓存的最佳选择。它或多或少起作用,但它有点剥落,我对它不是百分之百的满意(用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)尝试使用setAppCacheEnabled和setAppCacheMaxSize将缓存大小限制为非常小,较低的缓存大小将导致更快的清理。
EX: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");
希望这样能更快地得到结果。
关于android - Android Webview的ClearCache非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14392414/