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/

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

17 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

Чтобы очистить файлы cookie и кеш из 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();

Единственное решение, которое работает для меня

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

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

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");
    }
}
      webView.clearCache(true)
appFormWebView.clearFormData()
appFormWebView.clearHistory()
appFormWebView.clearSslPreferences()
CookieManager.getInstance().removeAllCookies(null)
CookieManager.getInstance().flush()
WebStorage.getInstance().deleteAllData()

Предыдущий код устарел. Итак, вы можете попробовать это в базовых проектах Kotlin для Android:

      CookieManager.getInstance().removeAllCookies {  
   // Do your work here.
}

Просто использование кода ниже в Котлине работает для меня

WebView(applicationContext).clearCache(true)
CookieSyncManager.createInstance(this);         
CookieManager cookieManager = CookieManager.getInstance();        
cookieManager.removeAllCookie();
CookieSyncManager.createInstance(this);    
CookieManager cookieManager = CookieManager.getInstance(); 
cookieManager.removeAllCookie();

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

чтобы полностью очистить кеш в котлине, вы можете использовать:

      context.cacheDir.deleteRecursively()

На всякий случай кому-то понадобится код котлина (:

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

Сделал трюк

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

getSettings().setSaveFormData(false);

Чтобы очистить историю, просто сделайте:

this.appView.clearHistory();

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

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

проблема: у меня есть похожая проблема, в которой когда-то я открываю url_one в webview, затем попробуйте открыть другой 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();
    }
}
Другие вопросы по тегам