Android Webview-完全清除缓存

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

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

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

我在这里也遵循了这个建议: 如何为 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 代码的网页产生的网络视图,所以我知道网络视图必须缓存的地方。

在 IRC 频道上,我被指向一个从 URL 连接中删除缓存的修复程序,但是还不知道如何将它应用到 WebView 中。

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

如果我删除我的应用程式并重新安装它,我可以让网页重新更新,即非缓存版本。主要问题是网页中的链接发生了变化,所以网页的前端完全没有变化。

212511 次浏览

这将清除应用程序缓存,这应该是您的网络视图缓存所在的位置

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

我找到了你想要的解决办法:

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

由于某些原因,Android 在 URL 的缓存上出现了问题,它总是意外地返回 URL,而不是你需要的新数据。当然,您可以只删除数据库中的条目,但在我的情况下,我只是试图访问一个 URL,所以吹走整个数据库更容易。

不要担心,这些数据库只是与您的应用程序相关联,所以您不会清除整个手机的缓存。

上面由 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));
}

希望对其他人有用:)

我找到了一个简洁明了的清除缓存的解决方案

WebView obj;
obj.clearCache(true);

Http://developer.android.com/reference/android/webkit/webview.html#clearcache%28boolean%29

我一直试图找出清除缓存的方法,但我们所能做的就是从上述方法删除本地文件,但它从来没有清除内存。

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

确保使用下面的方法,当单击输入字段时,表单数据不会显示为自动弹出。

getSettings().setSaveFormData(false);

为了澄清历史,只要做:

this.appView.clearHistory();

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

要清除所有的 webview 缓存,而您签出形式您的应用程序:

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

棒棒糖及以上:

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

它可以清除谷歌帐户在我的网络视图

在 Kotlin 简单地使用下面的代码就可以了

WebView(applicationContext).clearCache(true)

对我来说唯一有效的解决办法

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

要从 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();
webView.clearCache(true)
appFormWebView.clearFormData()
appFormWebView.clearHistory()
appFormWebView.clearSslPreferences()
CookieManager.getInstance().removeAllCookies(null)
CookieManager.getInstance().flush()
WebStorage.getInstance().deleteAllData()
context.deleteDatabase("webview.db");
context.deleteDatabase("webviewCache.db")

成功了

完全清空 Kotlin 的缓存,你可以使用:

context.cacheDir.deleteRecursively()

以防有人需要 kotlin 密码(: