2011-12-11 23 views
9

Estoy tratando de obtener la versión en caché sin conexión HTML5 de un sitio web para mostrar cuando la red está dentro de una vista web.que muestra la versión almacenada en caché de webview en android

He reemplazado onReceivedError bien, y cuando la red está inactiva, se llama a este método. El problema es que muestra el mensaje genérico de "Página web no disponible".

¿Cómo puedo obtener que muestre la versión en caché HTML5 de la página? El almacenamiento fuera de línea de la aplicación web definitivamente está funcionando, ya que funciona bien en la versión de escritorio de Firefox y Chrome.

Sé que puedo llamar al loadData en la vista manualmente en onReceivedError, pero no estoy seguro de dónde puedo obtener el valor en caché HTML5.

Nota: Si fijo algunos datos ficticios en loadData como view.loadData(Uri.encode("<html><div>Page load failed</div></html>"), "text/html", "UTF-8"); y luego en la espalda (mediante la detección de volver evento y llamar webview.goBack(); a continuación la versión en caché de la página se visualiza bien

Estas son algunas líneas de código. he añadido a la configuración de la vista web:.

webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); 
webview.getSettings().setAppCacheMaxSize(1024*1024*8);       
webview.getSettings().setAppCachePath("/data/data/com.stuff.android/cache"); 
webview.getSettings().setAllowFileAccess(true); 
webview.getSettings().setAppCacheEnabled(true); 
webview.getSettings().setDomStorageEnabled(true); 
webview.getSettings().setJavaScriptEnabled(true); 

Respuesta

6

tratar de averiguar el estado de la red utilizando

private boolean isNetworkAvailable() { 
    ConnectivityManager connectivityManager 
      = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null; 
} 

(Detect whether there is an Internet connection available on Android)

Esto también necesita

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

en su AndroidManifest.xml

Ahora usted puede configurar el comportamiento de caché ya sea a LOAD_CACHE_ONLY o para LOAD_NO_CACHE, según se trate de una conexión de red está disponible, con

webview.getSettings().setCacheMode(...) 
+0

esta es probablemente la solución "más limpia", así que le doy los puntos de recompensa :) – Marty

2

creo que una buena solución sería utilizar LOAD_NORMAL y onReceivedError navegar hacia atrás creo que esto va a cargar la caché de acuerdo con la documentación (no estoy seguro si no recuerdo mal) pero ten cuidado no para quedarse atascado en un bucle infinito


Es raro .. De acuerdo con la documentation:

Anular la forma en que se utiliza la memoria caché. La forma en que se utiliza la memoria caché se basa en en la opción de navegación. Para una carga de página normal, la caché se marca y el contenido se vuelve a validar según sea necesario. Cuando se navega hacia atrás, el contenido no se revalida, sino que el contenido simplemente se extrae del caché. Esta función permite al cliente anular este comportamiento.

Sin embargo el comportamiento que desea no parece ser uno de estos:

  1. LOAD_CACHE_ELSE_NETWORK

    Usar caché si el contenido está ahí, incluso si caducado (por ejemplo, la historia de navegación) Si no está en el caché, carga desde la red.

  2. LOAD_CACHE_ONLY

    No use la red, la carga de la única caché.

  3. LOAD_DEFAULT

    patrón de uso de caché por defecto

  4. LOAD_NORMAL

    patrón de uso normal caché

  5. LOAD_NO_CACHE

    No utilice la memoria caché, la carga de la red


No sé si se puede subclase el WebView para obtener el flujo deseado.


+0

lo siento se olvidó de mencionar, he editado mi pregunta .. – Marty

+0

@Marty hizo intenta cambiar LOAD_DEFAULT a LOAD_NORMAL –

+0

siendo sólo tiene genérico "Página Web no disponible" mensaje cuando la conexión a la red está abajo cuando uso LOAD_NORMAL – Marty

1

qué no funciona si simplemente deja que el navegador manejar esto? Especificar el manifiesto en la etiqueta HTML como esto:

<html manifest="mycache.appcache"> 

... y el navegador debe utilizar automáticamente cuando no hay conexión disponible, que no es necesario cambiar ninguna configuración en absoluto.

0

Primero debe establecer el permiso en su AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 

A continuación, compruebe la red de Internet está encendido o apagado por:

private boolean isNetworkAvailable() { 
      ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
      NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
      return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
     } 

Por último añadir a continuación código con su Webview objeto

webView = (WebView) findViewById(R.id.WebEngine); 
     webView.getSettings().setAppCacheMaxSize(5 * 1024 * 1024); // 5MB 
     webView.getSettings().setAppCachePath(getApplicationContext().getCacheDir().getAbsolutePath()); 
     webView.getSettings().setAllowFileAccess(true); 
     webView.getSettings().setAppCacheEnabled(true); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); 
     if (!isNetworkAvailable()) { // loading offline 
      webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); 
     } 
webView.loadUrl("http://www.geekonjava.blogspot.com/?m=1"); 

Eso es todo si su internet está en su página web abrir versi normal en y guardado en caché y si su internet está desactivado entonces automáticamente se abre en la versión en caché.

Cuestiones relacionadas