web-dev-qa-db-fra.com

Webview Android - Vider complètement le cache

J'ai une vue Web dans l'une de mes activités et, lorsqu'elle charge une page Web, cette page recueille des données d'arrière-plan de Facebook.

Ce que je vois cependant, c'est que la page affichée dans l'application est la même à chaque ouverture et rafraîchissement de l'application.

J'ai essayé de configurer WebView pour ne pas utiliser le cache et vider le cache et l'historique de WebView.

J'ai également suivi la suggestion ici: Comment vider le cache pour WebView?

Mais rien de tout cela ne fonctionne, est-ce que quelqu'un a une idée de ce que je peux surmonter ce problème, car c'est une partie vitale de mon application.

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

J'ai donc implémenté la première suggestion (Bien que le code soit récursif)

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

Cependant, cela n'a toujours pas changé ce que la page affiche. Sur mon navigateur de bureau, je reçois un code HTML différent de la page Web produite dans WebView. Je sais donc que WebView doit être mis en cache quelque part.

Sur le canal IRC, un correctif a été indiqué pour supprimer la mise en cache d’une connexion URL, mais je ne vois pas encore comment l’appliquer à une WebView.

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

Si je supprime mon application et la réinstalle, je peux remettre la page Web à jour, c’est-à-dire une version non mise en cache. Le problème principal est que les modifications sont apportées aux liens dans la page Web, de sorte que le début de la page Web est complètement inchangé.

90
Matt Gaunt

L'extrait de code modifié ci-dessus publié par Gaunt Face contient une erreur en ce que si la suppression d'un répertoire échoue car l'un de ses fichiers ne peut pas être supprimé, le code continuera à réessayer dans une boucle infinie. Je l'ai réécrit pour qu'il soit vraiment récursif et j'ai ajouté un paramètre numDays afin que vous puissiez contrôler l'âge des fichiers à élaguer:

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

Si tout va bien utile à d'autres personnes :)

39
markjan

J'ai trouvé une solution même élégante et simple pour effacer le cache 

WebView obj;
obj.clearCache(true);

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

J'essayais de trouver le moyen de vider le cache, mais tout ce que nous pouvions faire avec les méthodes mentionnées ci-dessus était de supprimer les fichiers locaux, mais cela ne nettoyait jamais la mémoire vive.

L'API clearCache libère la RAM utilisée par la vue Web et oblige par conséquent à charger à nouveau la page Web. 

178
Akshat

J'ai trouvé le correctif que vous cherchiez:

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

Pour une raison quelconque, Android crée un mauvais cache de l’URL qu’il ne cesse de renvoyer par accident au lieu des nouvelles données dont vous avez besoin. Bien sûr, vous pouvez simplement supprimer les entrées de la base de données, mais dans mon cas, je n’essaie d’accéder qu’à une seule URL.

Et ne vous inquiétez pas, ces bases de données sont simplement associées à votre application, ce qui vous évite de vider le cache de tout le téléphone.

40
Scott

Pour effacer tous les caches de visualisation Web pendant que vous vous déconnectez de votre application:

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

Pour sucette et ci-dessus:

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

Cela devrait effacer le cache de vos applications, qui devrait se trouver à l'emplacement de votre cache Webview.

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

cas d'utilisation: la liste des éléments s'affiche dans la vue du recycleur, chaque fois qu'un élément clique dessus, il masque la vue du recycleur et affiche la vue Web avec l'URL de l'élément.

problème: J'ai un problème similaire dans lequel une fois que j’ouvre un url_one dans Webview, puis que j’essaie d’ouvrir un autre url_two dans webview, il affiche url_one dans fond jusqu’à url_two est chargé.

solution: donc pour résoudre ce que j’ai fait, il faut charger une chaîne vide "" sous la forme url juste avant de masquer url_one et de charger url_two.

sortie: chaque fois que je charge une nouvelle URL dans la visualisation Web, aucune autre page Web ne s'affiche en arrière-plan.

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

Il peut effacer le compte Google dans ma vue Web

0

Pour effacer l'historique, faites simplement:

this.appView.clearHistory();

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

0
Alan CN

Assurez-vous que vous utilisez la méthode ci-dessous pour que les données de formulaire ne s'affichent pas comme des opérations automatiques lorsque vous cliquez sur les champs de saisie.

getSettings().setSaveFormData(false);
0
Raghu