【问题标题】:Android Webview's ClearCache is very slowAndroid Webview 的 ClearCache 很慢
【发布时间】: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;
        }
    }
}

【问题讨论】:

    标签: android caching webview clear-cache


    【解决方案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 秒)。似乎只有在我强制停止应用程序后,清除缓存的时间才会重置为合理的时间(几毫秒)。
    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多