it-swarm.com.de

Android Webview - Den Cache vollständig löschen

Ich habe eine WebView in einer meiner Aktivitäten, und wenn eine Webseite geladen wird, sammelt die Seite einige Hintergrunddaten von Facebook.

Was ich jedoch sehe, ist, dass die in der Anwendung angezeigte Seite bei jedem Öffnen und Aktualisieren der App gleich ist.

Ich habe versucht, den WebView so einzustellen, dass er den Cache nicht verwendet und den Cache und den Verlauf des WebView löscht.

Ich bin auch dem Vorschlag hier gefolgt: Wie leeren Sie den Cache für WebView?

Aber nichts davon funktioniert, hat jemand eine Idee, dass ich dieses Problem überwinden kann, weil es ein wesentlicher Teil meiner Bewerbung ist.

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

Also habe ich den ersten Vorschlag implementiert (obwohl der Code rekursiv geändert wurde)

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

Dies hat jedoch immer noch nichts an der Anzeige der Seite geändert. In meinem Desktop-Browser erhalte ich einen anderen HTML-Code als die im WebView erzeugte Webseite, sodass ich weiß, dass das WebView irgendwo zwischengespeichert werden muss.

Auf dem IRC -Kanal wurde auf einen Fix verwiesen, mit dem die Zwischenspeicherung von einer URL-Verbindung entfernt werden soll, aber noch nicht gesehen, wie sie auf ein WebView angewendet werden kann.

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

Wenn ich meine Anwendung lösche und neu installiere, kann ich die Webseite auf den neuesten Stand bringen, d. H. Eine nicht zwischengespeicherte Version. Das Hauptproblem besteht darin, dass Änderungen an den Links auf der Webseite vorgenommen werden, so dass das vordere Ende der Webseite völlig unverändert bleibt.

90
Matt Gaunt

Der bearbeitete Code-Snippet von Gaunt Face enthält einen Fehler: Wenn ein Verzeichnis nicht gelöscht werden kann, weil eine seiner Dateien nicht gelöscht werden kann, wird der Code in einer Endlosschleife wiederholt. Ich habe es neu geschrieben, um wirklich rekursiv zu sein, und fügte einen numDays-Parameter hinzu, mit dem Sie steuern können, wie alt die Dateien sein müssen, die gelöscht wurden:

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

Hoffentlich nützlich für andere Leute :)

39
markjan

Ich fand eine elegante und einfache Lösung zum Löschen des Cache 

WebView obj;
obj.clearCache(true);

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

Ich habe versucht herauszufinden, wie der Cache geleert werden kann, aber wir konnten mit den oben genannten Methoden nur die lokalen Dateien entfernen, der RAM wurde jedoch nie bereinigt.

Der API clearCache gibt den vom Webview verwendeten RAM frei und fordert daher das erneute Laden der Webseite auf. 

178
Akshat

Ich habe den Fix gefunden, nach dem Sie gesucht haben:

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

Aus irgendeinem Grund macht Android einen schlechten Cache für die URL, die immer wieder versehentlich zurückgegeben wird, anstelle der neuen Daten, die Sie benötigen. Sicher, Sie können die Einträge einfach aus der Datenbank löschen, aber in meinem Fall versuche ich nur, auf eine URL zuzugreifen.

Und machen Sie sich keine Sorgen, diese DBs sind nur Ihrer App zugeordnet, so dass Sie den Cache des gesamten Telefons nicht leeren.

40
Scott

So löschen Sie alle Webview-Caches, während Sie OUT von Ihrer APP aus signieren:

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

Für Lutscher und darüber:

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

Dies sollte Ihren Anwendungscache leeren, wo sich auch Ihr Webview-Cache befinden sollte

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

Anwendungsfall: Die Liste der Artikel wird in der Recycler-Ansicht angezeigt. Jedes Mal, wenn ein Artikel angeklickt wird, wird die Recycler-Ansicht ausgeblendet und die Web-Ansicht mit der Artikel-URL angezeigt.

Problem: Ich habe ein ähnliches Problem: Sobald ich einen url_one in der Webansicht öffne und dann versuche, einen anderen url_two in der Webansicht zu öffnen, wird url_one in Hintergrund angezeigt, bis url_two geladen ist.

Lösung: Also, um zu lösen, was ich getan habe, laden Sie leere Zeichenfolge "" als url, bevor Sie url_one verstecken und url_two laden.

Ausgabe: Wenn ich eine neue URL in Webview lade, wird im Hintergrund keine andere Webseite angezeigt.

code

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
Abhiode
CookieSyncManager.createInstance(this);         
CookieManager cookieManager = CookieManager.getInstance();        
cookieManager.removeAllCookie();
0
WaqasArshad
CookieSyncManager.createInstance(this);    
CookieManager cookieManager = CookieManager.getInstance(); 
cookieManager.removeAllCookie();

Es kann Google-Konto in meinem Webview löschen

0

Um den Verlauf zu löschen, führen Sie einfach Folgendes aus:

this.appView.clearHistory();

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

0
Alan CN

Stellen Sie sicher, dass Sie die Methode unten verwenden, damit die Formulardaten nicht als Autopop angezeigt werden, wenn Sie auf Eingabefelder klicken.

getSettings().setSaveFormData(false);
0
Raghu