2011-09-24 16 views
16

¿Es posible evitar que un WebView guarde en caché los datos en/data/data/???/cache/webViewCache? He puesto lo siguiente en la WebSettings pero la carpeta de caché todavía se utiliza:Prevenir datos de caché de Android WebView

webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); 
webSettings.setAppCacheEnabled(false); 

me he dado cuenta de que los archivos de caché se eliminan en la salida de la aplicación o cuando la solicitud pasa a un segundo plano, pero yo preferiría para que no se creen en absoluto. Además, me gustaría evitar el uso de webview.db & webviewCache.db en/data/data/???/database. Actualmente elimino las bases de datos de esta manera:

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

Esto parece tener el efecto deseado y no parecen ser recreado de nuevo para el uso de los archivos. ¿Es seguro asumir que este es el caso?

+0

¿Ha tenido un poco de suerte para evitar el almacenamiento en caché? – omega

+0

Me temo que no. – dbotha

Respuesta

40

Las notas de esta página me llevan a creer que no queremos que usted tenga acceso bien a la caché:

http://developer.android.com/reference/android/webkit/CacheManager.html

Por lo que yo puedo decir, hay (al menos) dos formas de mantener el caché. No he escrito nada de esto en una aplicación, por lo que no hay garantías:

(1) Cada vez que su WebView termine una página, borre la caché. Algo como esto en su WebViewClient:

@Override 
public void onPageFinished(WebView view, String url) { 
    super.onPageFinished(view, url); 
    view.clearCache(true); 
} 

(2) Si no le importa demasiado lo que se almacena, sino que sólo quiere el contenido más reciente, es posible que pueda lograr esto estableciendo las cabeceras http correctas en loadUrl (obviamente querrías probar esto contra tu servidor). Además, esto sólo está disponible para Android API 8+

Map<String, String> noCacheHeaders = new HashMap<String, String>(2); 
    noCacheHeaders.put("Pragma", "no-cache"); 
    noCacheHeaders.put("Cache-Control", "no-cache"); 
    view.loadUrl(url, noCacheHeaders); 

Tal vez probamos este, pero tal vez también ajustar el tamaño de caché WebView a algo pequeño. No estoy seguro si 0 funcionará, entonces quizás 1:

wv.getSettings().setAppCacheMaxSize(1); 

¡Buena suerte!

+0

Me las arreglé para borrarlo simplemente llamé 'webView.clearCache (true)' y luego volví a cargar 'webView.loadData()'. Parece que no funciona sin volver a cargar algo nuevo. – Nevermore

+0

wv.getSettings(). SetAppCacheMaxSize (1); ¡es obsoleto! – GeneralKimi

12

En mi aplicación (en Android 4.2.2) cargo en una página web una página web con imágenes que puedo cambiar en tiempo de ejecución (reemplazo las imágenes mientras sigo la ruta). La solución de Matt (1)

@Override 
public void onPageFinished(WebView view, String url) { 
    super.onPageFinished(view, url); 
    view.clearCache(true); 
} 

funciona para mí, la solución (2) no! Cheers

+0

¡Gracias por compartir qué solución funciona mejor! – Matt