Android Webview - полностью очистить кэш - PullRequest
94 голосов
/ 17 марта 2010

У меня есть 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/

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

Ответы [ 10 ]

188 голосов
/ 21 марта 2012

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

WebView obj;
obj.clearCache(true);

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

Я пытался выяснить, как очистить кеш, но все, что мы могли сделать из вышеупомянутых методов, это удалить локальные файлы, но это никогда не очистило оперативную память.

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

40 голосов
/ 13 сентября 2010

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

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

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

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

39 голосов
/ 21 октября 2010

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

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

31 голосов
/ 05 июня 2014

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

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

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

CookieSyncManager.createInstance(this);         
CookieManager cookieManager = CookieManager.getInstance();        
cookieManager.removeAllCookies(ValueCallback);
3 голосов
/ 17 марта 2010

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

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");
    }
}
0 голосов
/ 06 марта 2019

вариант использования: список элементов отображается в представлении переработчика, каждый раз, когда щелкает любой элемент, он скрывает представление переработчика и показывает веб-представление с URL-адресом элемента.

Проблема: У меня есть аналогичная проблема, в которой, как только я открываю url_one в веб-представлении, а затем попробуйте открыть другой url_two в веб-представлении, он показывает url_one в фон до загрузки url_two.

решение: чтобы решить, что я сделал, загрузите пустую строку "" как url как раз перед тем, как скрыть url_one и загрузить url_two.

вывод: всякий раз, когда я загружаю новый URL в веб-просмотр, он не отображает другие веб-страницы в фоновом режиме.

код

public void showWebView(String url){
        webView.loadUrl(url);
        recyclerView.setVisibility(View.GONE);
        webView.setVisibility(View.VISIBLE);
    }

public void onListItemClick(String url){
   showWebView(url);
}

public void hideWebView(){
        // loading blank url so it overrides last open url
        webView.loadUrl("");
        webView.setVisibility(View.GONE);
        recyclerView.setVisibility(View.GONE);
   }


 @Override
public void onBackPressed() {
    if(webView.getVisibility() == View.VISIBLE){
        hideWebView();
    }else{
        super.onBackPressed();
    }
}
0 голосов
/ 06 января 2019
CookieSyncManager.createInstance(this);    
CookieManager cookieManager = CookieManager.getInstance(); 
cookieManager.removeAllCookie();

Это может очистить учетную запись Google в моем веб-просмотре

0 голосов
/ 14 декабря 2018
CookieSyncManager.createInstance(this);         
CookieManager cookieManager = CookieManager.getInstance();        
cookieManager.removeAllCookie();
0 голосов
/ 25 февраля 2014

Чтобы очистить историю, просто выполните:

this.appView.clearHistory();

Источник: http://developer.android.com/reference/android/webkit/WebView.html

0 голосов
/ 28 декабря 2012

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

getSettings().setSaveFormData(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...