我在Android应用中使用WebViews,我需要阻止WebViews缓存。
不幸的是,似乎这个看似简单的目标几乎无法实现。我使用的解决方案是在onPageFinished事件中执行webview.clearCache(true),以便每次加载页面时都清除缓存。有一些问题......
我注意到随着缓存的增长,执行clearCache方法变得非常耗时。有时,如果您执行clearCache然后切换到包含不同webview的不同Activity,则该webview将不会加载几秒钟,因为它仍在等待先前的clearCache操作完成。
更糟糕的是,在缓存已被清除后,后续调用clearCache的执行时间似乎没有减少。如果对clearCache的调用需要3秒才能完成,然后我立即再次调用clearCache,那么我希望第二次调用clearCache几乎立即完成。但那不是我所经历的;我遇到第二次调用clearCache仍然需要大约3秒钟。
还有其他人经历过这个吗?有什么方法可以提高性能吗?加载webview(从本地文件系统)等待2-3秒是非常糟糕的。
编辑:
这是我实际清除缓存的最佳选择。它或多或少有效,但它有点不稳定,我对它不是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;
}
}
}
答案 0 :(得分:7)
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");
这可能会给结果带来更快的结果,希望如此。
答案 1 :(得分:1)
当您要进行下一个活动时,请完成上一个活动。这样您就可以释放该活动占用的所有内存。 希望这会有所帮助。