Android Webview – 完全清除caching

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

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

我已经尝试设置WebView不使用caching并清除WebView的caching和历史logging。

我也按照这里的build议: 如何清空WebViewcaching?

但是这些都不起作用,有没有人有任何想法可以克服这个问题,因为它是我的应用程序的重要组成部分。

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

所以我实现了第一个build议(虽然把代码改成了recursion)

 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必须caching在某处。

在IRC频道上,我被指出了一个修正,即从URL连接中删除caching,但是看不到如何将它应用到WebView。

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

如果我删除我的应用程序并重新安装它,我可以将网页备份到最新版本,即非caching版本。 主要问题是对网页中的链接进行了修改,所以网页的前端完全没有变化。

上面编辑过的代码片段由Gaunt Face发布,其中包含一个错误,那就是如果一个目录无法删除,因为其中的一个文件无法删除,代码会一直在无限循环中重试。 我重写了它是真正的recursion,并添加了一个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)); } 

希望对其他人使用:)

我发现一个清除caching的优雅简单的解决scheme

 WebView obj; obj.clearCache(true); 

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

我一直在想办法清除caching,但是我们所能做的就是从上面提到的方法中删除本地文件,但是它永远不会清理内存。

API clearCache释放了webview所使用的内存,并因此要求重新加载网页。

我发现你正在寻找的修复:

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

由于某些原因,Android对url进行caching的时间不正确,而不是您需要的新数据。 当然,你可以删除从数据库中的条目,但在我的情况下,我只是试图访问一个URL,吹掉整个数据库更容易。

别担心,这些数据库只与您的应用程序相关联,因此您不清除整个手机的caching。

清除所有的网页视图caching,同时注销forms您的APP:

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

对于棒棒糖和以上:

 removeAllCookies(ValueCallback) 

这应该清除你的应用程序caching应该是你的webviewcaching的地方

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

要清除历史,只需:

 this.appView.clearHistory(); 

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

确保您使用下面的方法,表单数据不会显示为autopop时单击input字段。

 getSettings().setSaveFormData(false);