Android Webview 的 ClearCache 很慢

Posted

技术标签:

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

【问题讨论】:

【参考方案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 秒)。似乎只有在我强制停止应用程序后,清除缓存的时间才会重置为合理的时间(几毫秒)。

以上是关于Android Webview 的 ClearCache 很慢的主要内容,如果未能解决你的问题,请参考以下文章

android webview

android webview-android的webview怎么修改网页字体颜色和背景

Android 下的 WebView 中数据如何保存

android 升级webview版本,包括6.0系统

Android webview html5地理定位

如何给android的webview增添方法