Android Webview - 完全清除缓存

时间:2010-03-17 20:00:48

标签: android caching webview

我的一个活动中有一个WebView,当它加载一个网页时,该页面从Facebook收集了一些背景数据。

我看到的是,每次打开和刷新应用程序时,应用程序中显示的页面都是相同的。

我已尝试将WebView设置为不使用缓存并清除WebView的缓存和历史记录。

我也遵循了这里的建议:How to empty cache for WebView?

但这一切都不起作用,有没有人有任何想法我可以克服这个问题,因为它是我申请的重要部分。

    mWebView.setWebChromeClient(new WebChromeClient()
    {
           public void onProgressChanged(WebView view, int progress)
           {
               if(progress >= 100)
               {
                   mProgressBar.setVisibility(ProgressBar.INVISIBLE);
               }
               else
               {
                   mProgressBar.setVisibility(ProgressBar.VISIBLE);
               }
           }
    });
    mWebView.setWebViewClient(new SignInFBWebViewClient(mUIHandler));
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.clearHistory();
    mWebView.clearFormData();
    mWebView.clearCache(true);

    WebSettings webSettings = mWebView.getSettings();
    webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);

    Time time = new Time();
    time.setToNow();

    mWebView.loadUrl(mSocialProxy.getSignInURL()+"?time="+time.format("%Y%m%d%H%M%S"));

所以我实现了第一个建议(尽管将代码更改为递归)

private void clearApplicationCache()
{
    File dir = getCacheDir();

    if(dir!= null && dir.isDirectory())
    {
        try
        {
            ArrayList<File> stack = new ArrayList<File>();

            // Initialise the list
            File[] children = dir.listFiles();
            for(File child:children)
            {
                stack.add(child);
            }

            while(stack.size() > 0)
            {
                Log.v(TAG, LOG_START+"Clearing the stack - " + stack.size());
                File f = stack.get(stack.size() - 1);
                if(f.isDirectory() == true)
                {
                    boolean empty = f.delete();

                    if(empty == false)
                    {
                        File[] files = f.listFiles();
                        if(files.length != 0)
                        {
                            for(File tmp:files)
                            {
                                stack.add(tmp);
                            }
                        }
                    }
                    else
                    {
                        stack.remove(stack.size() - 1);
                    }
                }
                else
                {
                    f.delete();
                    stack.remove(stack.size() - 1);
                }
            }
        }
        catch(Exception e)
        {
            Log.e(TAG, LOG_START+"Failed to clean the cache");
        }
    }
}

然而,这仍未改变页面显示的内容。在我的桌面浏览器上,我得到了不同的HTML代码到WebView中生成的网页,所以我知道WebView必须在某处缓存。

在IRC频道上,我指出了一个修复程序,用于从URL连接中删除缓存,但无法看到如何将其应用于WebView。

http://www.androidsnippets.org/snippets/45/

如果我删除了我的应用程序并重新安装它,我可以更新网页,即非缓存版本。主要问题是对网页中的链接进行了更改,因此网页的前端完全没有变化。

15 个答案:

答案 0 :(得分:186)

我找到了一个清除缓存的优雅而简单的解决方案

WebView obj;
obj.clearCache(true);

http://developer.android.com/reference/android/webkit/WebView.html#clearCache%28boolean%29

我一直在试图找出清除缓存的方法,但我们从上面提到的方法中做的就是删除本地文件,但它从不清理RAM。

API clearCache释放了webview使用的RAM,因此要求再次加载网页。

答案 1 :(得分:40)

我找到了你要找的修补程序:

context.deleteDatabase("webview.db");
context.deleteDatabase("webviewCache.db");

出于某种原因,Android会对网址进行错误的缓存,而不是您需要的新数据。当然,您可以删除数据库中的条目,但在我的情况下,我只是尝试访问一个URL,因此更容易吹掉整个数据库。

请不要担心,这些数据库只与您的应用相关联,因此您无法清除整个手机的缓存。

答案 2 :(得分:39)

由Gaunt Face发布的上面编辑的代码片段包含一个错误,如果目录无法删除,因为其中一个文件无法删除,代码将继续在无限循环中重试。我把它改写成真正的递归,并添加了一个numDays参数,这样你就可以控制修剪文件的年龄:

//helper method for clearCache() , recursive
//returns number of deleted files
static int clearCacheFolder(final File dir, final int numDays) {

    int deletedFiles = 0;
    if (dir!= null && dir.isDirectory()) {
        try {
            for (File child:dir.listFiles()) {

                //first delete subdirectories recursively
                if (child.isDirectory()) {
                    deletedFiles += clearCacheFolder(child, numDays);
                }

                //then delete the files and subdirectories in this dir
                //only empty directories can be deleted, so subdirs have been done first
                if (child.lastModified() < new Date().getTime() - numDays * DateUtils.DAY_IN_MILLIS) {
                    if (child.delete()) {
                        deletedFiles++;
                    }
                }
            }
        }
        catch(Exception e) {
            Log.e(TAG, String.format("Failed to clean the cache, error %s", e.getMessage()));
        }
    }
    return deletedFiles;
}

/*
 * Delete the files older than numDays days from the application cache
 * 0 means all files.
 */
public static void clearCache(final Context context, final int numDays) {
    Log.i(TAG, String.format("Starting cache prune, deleting files older than %d days", numDays));
    int numDeletedFiles = clearCacheFolder(context.getCacheDir(), numDays);
    Log.i(TAG, String.format("Cache pruning completed, %d files deleted", numDeletedFiles));
}

希望对其他人有用:)

答案 3 :(得分:30)

从APP中注销OUT时清除所有webview缓存:

CookieSyncManager.createInstance(this);         
CookieManager cookieManager = CookieManager.getInstance();        
cookieManager.removeAllCookie();

对于Lollipop及以上:

CookieSyncManager.createInstance(this);         
CookieManager cookieManager = CookieManager.getInstance();        
cookieManager.removeAllCookies(ValueCallback);

答案 4 :(得分:7)

要从Webview清除cookie和缓存,

    // Clear all the Application Cache, Web SQL Database and the HTML5 Web Storage
    WebStorage.getInstance().deleteAllData();

    // Clear all the cookies
    CookieManager.getInstance().removeAllCookies(null);
    CookieManager.getInstance().flush();

    webView.clearCache(true);
    webView.clearFormData();
    webView.clearHistory();
    webView.clearSslPreferences();

答案 5 :(得分:3)

这应该清除您的应用程序缓存,该缓存应该是您的webview缓存

的位置
File dir = getActivity().getCacheDir();

if (dir != null && dir.isDirectory()) {
    try {
        File[] children = dir.listFiles();
        if (children.length > 0) {
            for (int i = 0; i < children.length; i++) {
                File[] temp = children[i].listFiles();
                for (int x = 0; x < temp.length; x++) {
                    temp[x].delete();
                }
            }
        }
    } catch (Exception e) {
        Log.e("Cache", "failed cache clean");
    }
}

答案 6 :(得分:3)

唯一适用于我的解决方案

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
    CookieManager.getInstance().removeAllCookies(null);
    CookieManager.getInstance().flush();
} 

答案 7 :(得分:1)

webView.clearCache(true)
appFormWebView.clearFormData()
appFormWebView.clearHistory()
appFormWebView.clearSslPreferences()
CookieManager.getInstance().removeAllCookies(null)
CookieManager.getInstance().flush()
WebStorage.getInstance().deleteAllData()

答案 8 :(得分:0)

确保使用以下方法,单击输入字段时,表单数据不会显示为autopop。

getSettings().setSaveFormData(false);

答案 9 :(得分:0)

要清除历史记录,只需执行以下操作:

this.appView.clearHistory();

来源:http://developer.android.com/reference/android/webkit/WebView.html

答案 10 :(得分:0)

CookieSyncManager.createInstance(this);         
CookieManager cookieManager = CookieManager.getInstance();        
cookieManager.removeAllCookie();

答案 11 :(得分:0)

CookieSyncManager.createInstance(this);    
CookieManager cookieManager = CookieManager.getInstance(); 
cookieManager.removeAllCookie();

它可以清除我的网络视图中的Google帐户

答案 12 :(得分:0)

用例:物品列表在回收器视图中显示,每当单击任何物品时,它都会隐藏回收器视图并显示带有物品URL的网络视图。

问题: 我有类似的问题,一旦我在webview中打开 .factory('ContactService', [function () { var factory = {}; factory.getContacts = function (response) { var contactsList=contacts; return contactsList; }; return factory; }]); ,然后尝试在webview中打开另一个url_one,它就会在背景中显示url_two,直到{{ 1}}已加载。

解决方案: 因此要解决我所做的就是在隐藏url_one并加载url_two之前,将空白字符串""加载为url

输出:每当我在Webview中加载任何新网址时,它都不会在后台显示任何其他网页。

代码

url_one

答案 13 :(得分:0)

仅在Kotlin中使用以下代码对我有用

WebView(applicationContext).clearCache(true)

答案 14 :(得分:0)

context.deleteDatabase("webview.db");
context.deleteDatabase("webviewCache.db")

成功了