Android Webview的ClearCache非常慢

时间:2013-01-18 04:29:26

标签: android caching webview clear-cache

我在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;
        }
    }
}

2 个答案:

答案 0 :(得分:7)

1)尝试使用setAppCacheEnabledsetAppCacheMaxSize将缓存大小限制为非常小,较低的缓存大小将导致更快的清理。

例如: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)

当您要进行下一个活动时,请完成上一个活动。这样您就可以释放该活动占用的所有内存。 希望这会有所帮助。