Android Webview - Completely Clear the Cache

AndroidCachingWebview

Android Problem Overview


I have a WebView in one of my Activities, and when it loads a webpage, the page gathers some background data from Facebook.

What I'm seeing though, is the page displayed in the application is the same on each time the app is opened and refreshed.

I've tried setting the WebView not to use cache and clear the cache and history of the WebView.

I've also followed the suggestion here: https://stackoverflow.com/questions/1790254/how-to-empty-cache-for-webview

But none of this works, does anyone have any ideas of I can overcome this problem because it is a vital part of my application.

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

So I implemented the first suggestion (Although changed the code to be recursive)

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

However this still hasn't changed what the page is displaying. On my desktop browser I am getting different html code to the web page produced in the WebView so I know the WebView must be caching somewhere.

On the IRC channel I was pointed to a fix to remove caching from a URL Connection but can't see how to apply it to a WebView yet.

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

If I delete my application and re-install it, I can get the webpage back up to date, i.e. a non-cached version. The main problem is the changes are made to links in the webpage, so the front end of the webpage is completely unchanged.

Android Solutions


Solution 1 - Android

I found an even elegant and simple solution to clearing cache

WebView obj;
obj.clearCache(true);

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

I have been trying to figure out the way to clear the cache, but all we could do from the above mentioned methods was remove the local files, but it never clean the RAM.

The API clearCache, frees up the RAM used by the webview and hence mandates that the webpage be loaded again.

Solution 2 - Android

I found the fix you were looking for:

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

For some reason Android makes a bad cache of the url which it keeps returning by accident instead of the new data you need. Sure, you could just delete the entries from the DB but in my case I am only trying to access one URL so blowing away the whole DB is easier.

And don't worry, these DBs are just associated with your app so you aren't clearing the cache of the whole phone.

Solution 3 - Android

The edited code snippet above posted by Gaunt Face contains an error in that if a directory fails to delete because one of its files cannot be deleted, the code will keep retrying in an infinite loop. I rewrote it to be truly recursive, and added a numDays parameter so you can control how old the files must be that are pruned:

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

Hopefully of use to other people :)

Solution 4 - Android

To clear all the webview caches while you signOUT form your APP:

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

For Lollipop and above:

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

Solution 5 - Android

To clear cookie and cache from Webview,

    // 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();

Solution 6 - Android

The only solution that works for me

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

Solution 7 - Android

This should clear your applications cache which should be where your webview cache is

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

Solution 8 - Android

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

Solution 9 - Android

Simply using below code in Kotlin works for me

WebView(applicationContext).clearCache(true)

Solution 10 - Android

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

Solution 11 - Android

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

It can clear google account in my webview

Solution 12 - Android

Make sure you use below method for the form data not be displayed as autopop when clicked on input fields.

getSettings().setSaveFormData(false);

Solution 13 - Android

To clear the history, simply do:

this.appView.clearHistory();

Source: http://developer.android.com/reference/android/webkit/WebView.html

Solution 14 - Android

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

Did the trick

Solution 15 - Android

to completely clear the cache in kotlin you can use:

context.cacheDir.deleteRecursively()

Just in case someone needs the kotlin code (:

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMatt GauntView Question on Stackoverflow
Solution 1 - AndroidAkshatView Answer on Stackoverflow
Solution 2 - AndroidScottView Answer on Stackoverflow
Solution 3 - AndroidmarkjanView Answer on Stackoverflow
Solution 4 - AndroidamalBitView Answer on Stackoverflow
Solution 5 - AndroidSrinivasanView Answer on Stackoverflow
Solution 6 - AndroidKetan RamaniView Answer on Stackoverflow
Solution 7 - AndroidjqpubliqView Answer on Stackoverflow
Solution 8 - Androidkamal khalafView Answer on Stackoverflow
Solution 9 - AndroidErcanView Answer on Stackoverflow
Solution 10 - AndroidWaqasArshadView Answer on Stackoverflow
Solution 11 - AndroidDũng Phạm TiếnView Answer on Stackoverflow
Solution 12 - AndroidRaghuView Answer on Stackoverflow
Solution 13 - AndroidAlan CNView Answer on Stackoverflow
Solution 14 - AndroidTerreView Answer on Stackoverflow
Solution 15 - AndroidIskandirView Answer on Stackoverflow