Android Webview: borre completamente el caché
caching (7)
Asegúrese de utilizar el siguiente método para que los datos del formulario no se muestren como autopop cuando se hace clic en los campos de entrada.
getSettings().setSaveFormData(false);
Tengo una vista web en una de mis actividades, y cuando carga una página web, la página recopila algunos datos de fondo de Facebook.
Lo que estoy viendo, sin embargo, es que la página que se muestra en la aplicación es la misma cada vez que se abre y actualiza la aplicación.
Intenté configurar WebView para que no utilizara el caché y borre el caché y el historial del WebView.
También he seguido la sugerencia aquí: ¿Cómo vaciar el caché para WebView?
Pero nada de esto funciona, ¿alguien tiene alguna idea de que puedo superar este problema porque es una parte vital de mi aplicación?
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"));
Así que implementé la primera sugerencia (aunque cambié el código para que sea recursivo)
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");
}
}
}
Sin embargo, esto aún no ha cambiado lo que muestra la página. En mi navegador de escritorio obtengo un código html diferente para la página web producida en WebView, así que sé que WebView debe estar en caché en alguna parte.
En el canal de IRC, me señalaron una solución para eliminar el almacenamiento en caché de una conexión de URL, pero todavía no veo cómo aplicarlo a una WebView.
http://www.androidsnippets.org/snippets/45/
Si elimino mi aplicación y la vuelvo a instalar, puedo actualizar la página web, es decir, una versión no almacenada en caché. El principal problema es que los cambios se realizan a los enlaces en la página web, por lo que el front-end de la página web no se modifica.
El fragmento de código editado anteriormente publicado por Gaunt Face contiene un error en el sentido de que si un directorio no puede eliminarse porque uno de sus archivos no se puede eliminar, el código seguirá reintentando en un bucle infinito. Lo reescribí para que sea realmente recursivo, y agregué un parámetro numDays para que pueda controlar la antigüedad de los archivos que deben ser eliminados:
//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));
}
Con suerte de uso a otras personas :)
Encontré la solución que estabas buscando:
context.deleteDatabase("webview.db");
context.deleteDatabase("webviewCache.db");
Por alguna razón, Android crea un caché defectuoso de la url que sigue volviendo por accidente en lugar de los datos nuevos que necesita. Claro, podrías borrar las entradas de la base de datos, pero en mi caso solo estoy tratando de acceder a una URL, por lo que es más fácil volar la base de datos completa.
Y no se preocupe, estos DB solo están asociados con su aplicación, por lo que no está borrando la caché de todo el teléfono.
Encontré una solución incluso elegante y simple para borrar el caché
WebView obj;
obj.clearCache(true);
http://developer.android.com/reference/android/webkit/WebView.html#clearCache%28boolean%29
He estado tratando de encontrar la manera de borrar el caché, pero todo lo que pudimos hacer con los métodos mencionados anteriormente fue eliminar los archivos locales, pero nunca limpia la memoria RAM.
La API clearCache, libera la RAM utilizada por la vista web y, por lo tanto, exige que la página web se cargue de nuevo.
Esto debería borrar la memoria caché de las aplicaciones, que debería ser el lugar donde está la caché de su vista web.
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");
}
}
Para borrar la historia, simplemente hazlo:
this.appView.clearHistory();
Fuente: http://developer.android.com/reference/android/webkit/WebView.html
Para borrar todos los cachés de vistas web mientras firmas, forma tu APLICACIÓN:
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
Para Lollipop y arriba:
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookies(ValueCallback);