2

我在 Android 应用程序中使用 WebViews,我需要防止 WebViews 缓存。

不幸的是,这个看似简单的目标似乎几乎不可能实现。我使用的解决方案是在 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;
        }
    }
}
4

2 回答 2

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");

这可能会产生更快的结果,希望如此。

于 2013-01-18T05:37:16.123 回答
1

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

于 2013-01-18T04:59:02.410 回答