Android 4.4 con error ERR_CACHE_MISS en onReceivedError para WebView

Tengo una vista web en mi diseño. Por defecto, se abre un formulario de búsqueda en él. En la búsqueda, aparece una sección de listado debajo del formulario de búsqueda. Si se hace clic en cualquier enlace de la lista, se abre la página de detalles. Ahora quiero controlar la navegación trasera para la vista web. Coloqué este código en Actividad.

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { Log.d("TYPE", TYPE); WebView myWebView = null; if (TYPE.equalsIgnoreCase("REPORT_ACTIVITY")) myWebView = reportView; if (TYPE.equalsIgnoreCase("FEEDBACK_ACTIVITY")) myWebView = feedbackView; if (myWebView != null) // Check if the key event was the Back button and if there's history if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) { myWebView.goBack(); return true; } // If it wasn't the Back key or there's no web page history, bubble up // to the default // system behavior (probably exit the activity) return super.onKeyDown(keyCode, event); } private WebViewClient webViewClient = new WebViewClient() { public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.d("onPageStarted", "onPageStarted"); loadProgressBarBox.setVisibility(View.VISIBLE); //view.setVisibility(View.GONE); } public void onPageFinished(WebView view, String url) { Log.d("onPageFinished", "onPageFinished"); loadProgressBarBox.setVisibility(View.GONE); } public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Log.d("Error", "Error code: " + errorCode + "/" + description); } } 

También he configurado un WebViewClient con WebView. Cuando vuelvo a usar el botón Atrás está funcionando bien para cualquier versión 4.4. Pero cuando bash Android 4.4, vuelve bien de la página de detalles a la de listado. Pero tan pronto como trato de volver, está arrojando el código de error -1 y ERR_CACHE_MISS en la descripción. No se muestra ninguna página.

 09-04 06:59:05.666: D/Error(1102): Error code: -1/net::ERR_CACHE_MISS 

¿Cómo resolver este problema en Android 4.4?

En la mayoría de los casos, este error proviene de fuera de la aplicación (a veces es solo un permiso de INTERNET faltante, pero eso no suena como en este caso).

Estaba tipeando una explicación, pero encontré un ejemplo mucho más directo que funciona como una explicación en esta respuesta a otra pregunta . Aquí están los bits relevantes, re-hashed un poco:

  1. Joe completa un formulario de pedido con la información de su tarjeta de crédito
  2. El servidor procesa esa información y devuelve una página de confirmación / recibo marcada con no-cache en el encabezado, lo que significa que siempre se solicitará al servidor.
  3. Joe va a otra página.
  4. Joe hace clic atrás porque quiere verificar algo, llevándolo a la página de confirmación.

El problema surge de ese último paso. La página de confirmación se marcó con no-cache , por lo que debe solicitarse nuevamente al servidor. Pero para mostrar la misma página correctamente, los mismos datos que se pasaron la primera vez deben enviarse de nuevo.

Esto hace que Joe se facture dos veces, ya que se está realizando una nueva solicitud con la misma información que la última vez. Joe no será un campista feliz cuando encuentre dos cargos en su cuenta y un par de tiendas adicionales en su puerta.

Parece que esta situación era lo suficientemente común como para ser ahora un error estándar en la mayoría de los navegadores y, aparentemente, versiones más nuevas de Android. El error en realidad se origina en Chromium, por lo que verá el mismo error en Google Chrome, y por qué solo lo ve en 4.4 (que introdujo una nueva versión del WebView basado en Chromium ).

De hecho, probablemente lo haya visto antes, es el mensaje que aparece en la mayoría de los navegadores que le advierte con algo como “Para actualizar esta página, el navegador tendrá que volver a enviar los datos … yada yada yada”.

Esta es la forma de Android 4.4 de advertirte sobre lo que está pasando. Cómo solucionarlo realmente depende de a qué se está conectando, pero si busca esta situación, encontrará que es bastante común y tiene correcciones. El desencadenante exacto del error es en realidad cuando la solicitud no puede ser atendida desde el caché (en este caso, no-cache está causando eso).

Dependiendo de la naturaleza de la solicitud, tal vez no-cache se necesita realmente no-cache .

Pero desde la perspectiva de su aplicación, el principal problema es que onReceiveError es una especie de “último recurso” para WebView. Los errores que obtienes se han propagado desde el sistema subyacente. Y una vez que terminas allí, no puedes continuar cargando la página tal como está . Por lo tanto, no tiene posibilidad de permitir el reenvío, y no puede darle al usuario esa opción, a diferencia, digamos, de Google Chrome.

Me encontré con el mismo problema porque en mi carpeta de manifiesto tenía el permiso de Internet en mayúsculas:

Tuve (error)

  

Debería tener (sin error)

  

Utilizar

 if (Build.VERSION.SDK_INT >= 19) { mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); } 

Arreglará ERR_CACHE_MISS en WebView. Quizás necesite cambiarlo a SDK_INT == 19 después de algunas actualizaciones de Lollipop WebView, pero funciona por ahora.

este permiso en su archivo andriodManifest.xml