2010-03-17 16 views
79

Ich habe ein WebView in einer meiner Aktivitäten, und wenn es eine Webseite lädt, sammelt die Seite einige Hintergrunddaten von Facebook.Android Webview - Löschen Sie den Cache vollständig

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

Ich habe versucht, die WebView Cache nicht zu verwenden und löschen Sie den Cache und den Verlauf des WebView.

Ich habe folgte auch den Vorschlag hier: How to empty cache for WebView?

Aber keines dieser Werke, jemand irgendwelche Ideen von mir nicht haben kann, dieses Problem zu überwinden, weil es ein wichtiger Teil meiner Anwendung 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")); 

So implementiert ich den ersten Vorschlag (Obwohl der Code geändert rekursiv zu sein)

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

jedoch noch nicht geändert hat, was die Seite angezeigt wird. Auf meinem Desktop-Browser erhalte ich einen anderen HTML-Code für die Web-Seite, die im WebView erstellt wurde. Daher weiß ich, dass der WebView irgendwo zwischenspeichern muss.

Auf dem IRC-Kanal wurde ich auf eine Behebung verwiesen, um das Zwischenspeichern von einer URL-Verbindung zu entfernen, kann aber nicht sehen, wie man es auf ein WebView noch anwendet.

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

Wenn ich es meine Anwendung und lösche neu installieren, kann ich die Webseite auf dem neuesten Stand, das heißt eine nicht-Cache-Version zurück. Das Hauptproblem ist, dass die Änderungen an den Links in der Webseite vorgenommen werden, so dass das Frontend der Webseite vollständig unverändert bleibt.

+1

'mWebView.getSettings(). SetAppCacheEnabled (false);' Hat nicht funktioniert? – Paul

Antwort

39

Das bearbeitete Code-Snippet oben von Gaunt Face enthält einen Fehler darin, dass wenn ein Verzeichnis nicht gelöscht werden kann, weil eine seiner Dateien nicht gelöscht werden kann, der Code in einer Endlosschleife erneut versucht.Ich schrieb es wirklich rekursiv zu sein, und ein numdays Parameter hinzugefügt, damit Sie steuern können, wie alt die Dateien muss sein, dass beschnitten werden:

//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 Nutzungs andere Leute :)

+0

Gut finden Sie auf den Fehler :) –

+0

Vielen Dank! ihr habt mir meinen Tag gerettet :) – Kris

+0

Tolle Routine, ersparte uns eine Menge Qual. –

3

Dies sollte Ihre Anwendungen Cache löschen, die in dem Ihr webview Cache

ist sein 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"); 
    } 
} 
+0

Versucht dies (Code geringfügig geändert) und immer noch die gleichen Ergebnisse -> Erklärung oben –

+0

hilfreich. !!! :) –

38

ich das Update gefunden Sie suchen:

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

Aus irgendeinem Grund Android macht einen schlechten Cache die URL, die sie versehentlich anstelle der neuen Daten, die Sie benötigen, zurückgibt. Sicher, Sie könnten einfach die Einträge aus der DB löschen, aber in meinem Fall versuche ich nur auf eine URL zuzugreifen, so dass es einfacher ist, die gesamte DB wegzublasen.

Und keine Sorge, diese DBs sind nur mit Ihrer App verbunden, so dass Sie nicht den Cache des gesamten Telefons löschen.

+1

Totally arbeitete für mich! :) – Manuel

+0

Danke, das ist ein unglaublich netter Trick. Es verdient mehr bekannt zu sein. –

+2

Dies wirft eine böse Ausnahme in Waben: 06-14 22: 33: 34.349: Fehler/SQLiteDatabase (20382): Fehler beim Öffnen der Datenbank. Schließen Sie es. 06-14 22: 33: 34.349: Fehler/SQLiteDatabase (20382): android.database.sqlite.SQLiteDiskIOException: Festplatten-E/A-Fehler 06-14 22: 33: 34.349: Fehler/SQLiteDatabase (20382): bei Android. database.sqlite.SQLiteDatabase.native_setLocale (Native Methode) –

150

fand ich ein noch elegante und einfache Lösung für Clearing-Cache

WebView obj; 
obj.clearCache(true); 

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

ich habe versucht, die Art und Weise, um herauszufinden, den Cache zu löschen, aber alle können wir tun fro m die oben genannten Methoden entfernt die lokalen Dateien, aber es reinigt nie den RAM.

Die API clearCache gibt den von der Webansicht belegten RAM frei und erfordert daher, dass die Webseite erneut geladen wird.

+11

Die beste Antwort hier. – user486134

+1

Dies sollte die akzeptierte Antwort sein –

+0

Die beste Antwort und ich frage mich, warum es nicht akzeptiert .. Kudos Akshat :) – Karthik

0

Stellen Sie sicher, dass Sie die unten angegebene Methode verwenden, damit die Formulardaten beim Klicken auf Eingabefelder nicht als Autopop angezeigt werden.

getSettings().setSaveFormData(false); 
22

alle webview Caches zu löschen, während Sie Ihre APP bilden SignOut:

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

Für Lollipop und höher:

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

rette mein Leben und Tag. –

+0

Funktioniert einwandfrei, wenn Sie in Ihrer Aktivität keinen Zugriff auf webview haben. Beachten Sie auch, dass diese API veraltet ist. Verwenden Sie stattdessen die API "removeAllCookies (ValueCallback)" anstelle von L + -Geräten. – Akshat

Verwandte Themen