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-код на веб-страницу, созданный в WebView, поэтому я знаю, что WebView должен где-то кэшироваться.

На IRC-канале я указал на исправление, чтобы удалить кеширование из URL-соединения, но пока не вижу, как применить его к WebView.

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

Если я удалю свое приложение и переустановить его, я смогу обновить веб-страницу до версии, то есть не кэшированную версию. Основная проблема заключается в внесении изменений в ссылки на веб-странице, поэтому внешний интерфейс веб-страницы не изменяется.

Ответ 1

Отредактированный фрагмент кода выше, опубликованный 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));
}

Надеемся, что это будут другие люди:)

Ответ 2

Я нашел даже элегантное и простое решение для очистки кеша

WebView obj;
obj.clearCache(true);

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

Я пытался выяснить, как очистить кеш, но все, что мы могли сделать из вышеупомянутых методов, - удалить локальные файлы, но он никогда не очищает ОЗУ.

API clearCache, освобождает RAM, используемую веб-просмотром, и, следовательно, требует перезагрузки веб-страницы.

Ответ 3

Я нашел исправление, которое вы искали:

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

По какой-то причине Android делает плохой кэш URL-адреса, который он продолжает возвращаться случайно, а не новые данные, которые вам нужны. Конечно, вы могли бы просто удалить записи из БД, но в моем случае я только пытаюсь получить доступ к одному URL-адресу, так что проще всего удалить всю БД.

И не беспокойтесь, эти БД просто связаны с вашим приложением, поэтому вы не очищаете кеш всего телефона.

Ответ 4

Чтобы очистить все кэши веб-просмотра, пока вы подписываете форму из своего приложения:

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

Для леденцов и выше:

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

Ответ 5

Это должно очистить кэш приложений, который должен находиться в кеше веб-браузера

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

Убедитесь, что вы используете метод ниже для того, чтобы данные формы не отображались как autopop при нажатии на поля ввода.

getSettings().setSaveFormData(false);

Ответ 8

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