viernes, 20 de febrero de 2015

WebView: Cargando desde la caché

Operación a realizar

Una de las cosas que quería hacer era mostrar un enlace a una web desde la caché(siempre y cuando esa web haya sido visto con internet anteriormente).

Problema

Apenas sabía nada sobre los WebView y menos sobre como cargar un enlace desde la caché.

Búsqueda

Tanto a través de Google como de un libro que tengo "El gran libro de Android Avanzado" me puse a investigar si alguien anteriormente había intentando cargar un enlace desde la caché(obviamente sí).

Solución

Aunque me llevó un par de días hallar con la solución, en realidad es bastante simple indicar cuando quieres que intente cargar de caché.

Lo 1º es detectar si el usuario tiene tanto el WiFi como los datos del móvil activados. Si los tiene, el enlace se cargará con normalidad, pero sino tiene ninguna de las 2 es cuando podemos indicar como cargar desde la caché.

Vamos con el código de detectar si tiene o no internet y dentro habilitando caché o no:

ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Activity.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
try {
    if((info == null || !info.isConnected() || !info.isAvaliable()) {
         web.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY);
    } else
    {
         web.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
    }
catch(Exception e) {
     Log.e("ERROR", e.toString());
}
Con el ConnectivityMannager obtenemos el servicio que nos permite comprobar a través del NetworkInfo si tenemos WiFi o datos activados o sino los tenemos activados.

En el if se comprueba tanto si en "info"(info != null) está vacío, si no está conectado(!isConnected()) y si no tenemos disponible esa red(!isAvaliable()).

Justo dentro del if ponemos que si queremos que cargue de caché .setCacheMode(WebSettings.LOAD_CACHE_ONLY); o si cargar por defecto cuando tenemos internet(setCacheMode(WebSettings.LOAD_DEFAULT).

En internet ponen que para cargar de caché deberíamos poner (WebSettings.LOAD_CACHE_ELSE_NETWORK) que quiere decir que:
Aunque nuestros recursos de la caché hayan expirado, los vamos a utilizar si no hay internet.
Para mí es mucho mejor la solución que está en el código de antes porque aunque la que ponen por internet es buena, a mí en mi app no me cargaba todo lo que se vería si se cargara el enlace desde un navegador, y con el "LOAD_CACHE_ONLY" sí se mostraba todo.

El cargar la url del enlace(web.loadUrl("http://miweb.com"); os llega con ponerlo en el onCreate() y el resto de propiedades que le queráis poner lo poner en una función que creéis vosotros aparte.

2 comentarios:

  1. Tengo una duda, implementé el codigo para Fragment pero no logro cargar una página con el caché, ¿por qué?

    ResponderEliminar
  2. hey como abilito el descargar archivos en el webview, sabes alguna forma?

    ResponderEliminar