Android Webview - Completely Clear the Cache

203,657

Solution 1

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 2

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 3

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 4

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

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();
Share:
203,657
Matt Gaunt
Author by

Matt Gaunt

Updated on July 08, 2022

Comments

  • Matt Gaunt
    Matt Gaunt almost 2 years

    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: 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.

    • Paul
      Paul over 12 years
      mWebView.getSettings().setAppCacheEnabled(false); did not worked ?
  • Matt Gaunt
    Matt Gaunt over 14 years
    Tried this (Changed code slightly) and still got the same results -> Explained above
  • Philip Sheard
    Philip Sheard about 13 years
    Thanks, this is an incredibly neat trick. It deserves to be more widely known.
  • Kris
    Kris about 13 years
    Thanks a lot! you guys saved my day :)
  • Rafael Sanches
    Rafael Sanches about 13 years
    This throws a nasty exception in honeycomb: 06-14 22:33:34.349: ERROR/SQLiteDatabase(20382): Failed to open the database. closing it. 06-14 22:33:34.349: ERROR/SQLiteDatabase(20382): android.database.sqlite.SQLiteDiskIOException: disk I/O error 06-14 22:33:34.349: ERROR/SQLiteDatabase(20382): at android.database.sqlite.SQLiteDatabase.native_setLocale(Nati‌​ve Method)
  • Scott
    Scott about 13 years
    Cheers Rafael, I would like to think this is because the original issue has been resolved in Honeycomb. Does anyone know if this is the case?
  • Mr Ed
    Mr Ed almost 13 years
    Great routine, saved us a lot of agony.
  • Si8
    Si8 over 10 years
    Can I use this code within an app to clear cache for certain app installed on my phone?
  • source.rar
    source.rar over 10 years
    If the whole directory needs to be deleted wouldn't Runtime.getRuntime().exec("rm -rf "+dirName+"\n"); be easier?
  • markjan
    markjan almost 10 years
    @source.rar Yes, but then you have no ability to keep files younger than x days old, which typically you want for a cache folder.
  • Karthik
    Karthik almost 10 years
    The best answer and I wonder why its not accepted..Kudos Akshat :)
  • lostintranslation
    lostintranslation almost 9 years
    No luck for me. Wonder if something has changed? I can load a WebView with google.com and the WebView still thinks I am logged in, even after clearCache(true);
  • Fred
    Fred over 8 years
    You might want to put getTime() into a variable outside the loop so you don't call it everytime.
  • user4951834
    user4951834 over 8 years
    Is it possible to use this code to only delete HTML files in the cache?
  • NineToeNerd
    NineToeNerd over 8 years
    @lostintranslation For that you probably want to delete cookies. Though I'm sure you found that out by now.
  • Uday Nayak
    Uday Nayak almost 8 years
    save my life and day.
  • CrazyMind
    CrazyMind over 7 years
    just put 2 lines in onBackpress() or back button no history remain in back stack thanks saved lots of time.
  • Akshat
    Akshat over 7 years
    Works fine if you don't have access to webview in your activity. Also note that this API has been deprecated,so use the "removeAllCookies(ValueCallback)" API instead on L+ devices.
  • NoWar
    NoWar about 5 years
    CookieSyncManager is depricated
  • Giorgio Barchiesi
    Giorgio Barchiesi over 4 years
    Need to allocate the object? WebView obj= new WebView(this); obj.clearCache(true); Anyway, very good for me, upvoted!
  • Qaiser Hussain
    Qaiser Hussain over 4 years
    what should I replace with ValueCallBack?
  • amalBit
    amalBit over 4 years
    @QaisarKhanBangash new ValueCallback<Boolean>() { atOverride public void onReceiveValue(Boolean value) { } }