Android 4.4 dando ERR_CACHE_MISS error en onReceivedError para WebView volver

Tengo una webview en mi Layout. De forma predeterminada, se abre un formulario de búsqueda. 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 abrirá la página de detalles. Ahora quiero controlar la navegación posterior para la webview. 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 establecido un WebViewClient con el WebView. Cuando vuelvo utilizando el botón de nuevo está funcionando bien para cualquier versión 4.4. Pero cuando estoy tratando de Android 4.4, se está volviendo bien desde la página de detalles a la página de lista. Pero tan pronto como estoy tratando de volver de nuevo, su lanzamiento error código -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?

Este error realmente proviene de fuera de su aplicación en la mayoría de los casos (ocasionalmente es sólo un permiso de INTERNET perdido, pero eso no suena como el caso aquí).

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

  1. Joe llena un formulario de pedido con su información de tarjeta de crédito
  2. El servidor procesa esa información y devuelve una página de confirmación / recepción marcada con no-cache en el encabezado, lo que significa que siempre se solicitará desde el servidor.
  3. Joe va a otra página.
  4. Joe hace clic de nuevo porque quiere comprobar 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 de nuevo desde el servidor. Pero para mostrar la misma página correctamente, los mismos datos que se pasaron la primera vez necesitan ser enviados de nuevo.

Esto da como resultado que Joe sea facturado dos veces, ya que se está haciendo 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 adicional de tiendas de campaña en su puerta.

Parece que esta situación era bastante común que ahora es un error estándar en la mayoría de los navegadores, y al parecer, las nuevas versiones de Android. El error se origina realmente en Chromium, por lo que verás el mismo error en Google Chrome y por qué solo lo ves en 4.4 (que introdujo una nueva versión de WebView basada en Chrome ).

De hecho, en realidad lo has visto antes, es el mensaje que aparece en la mayoría de los navegadores que te advierten con algo en la línea de "Para actualizar esta página, el navegador tendrá que volver a enviar los datos … yada yada yada".

Esta es la manera de Android 4.4 de advertencia de lo que está pasando. Cómo solucionarlo realmente depende de lo que se está conectando, pero si busca esta situación, verá que es bastante común y tiene arreglos. El disparador exacto del error es realmente cuando la petición no puede ser servida de la memoria caché (en este caso, no-cache está causando eso).

Dependiendo de la naturaleza de la solicitud, tal vez no-cache no es realmente necesario.

Pero desde la perspectiva de su aplicación, el principal problema es que onReceiveError es una especie de "último recurso" para el WebView. Los errores que se obtienen se han propagado desde el sistema subyacente. Y una vez que termines allí, no puedes continuar la carga de la página como está . Así que no tienes la oportunidad de permitir que vuelva a enviar, y no se puede dar al usuario esa opción, a diferencia, digamos, 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)

 <uses-permission android:name="ANDROID.PERMISSION.INTERNET"/> 

Debe tener (sin error)

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

Utilizar

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

Se arreglará ERR_CACHE_MISS en el WebView. Tal vez necesitará cambiarlo a SDK_INT == 19 después de algunas actualizaciones de Lollipop WebView, pero funciona por ahora.

  • Android: comprueba si la solicitud es GET o POST
  • WebView loadUrl sólo funciona una vez
  • El bloqueo del sistema al reemplazar shouldInterceptRequest en WebViewClient
  • ¿Cuál es la diferencia entre setWebViewClient y setWebChromeClient?
  • OnPageStart se llama muchas veces y onPageFinished no se llama para una sola página
  • WebView - no puede descargar el archivo sin solicitarlo dos veces?
  • WebViewClient.onPageStarted () llamó dos veces al especificar URL no existente a través de WebView.loadURL ()
  • URL de Soundcloud abierta en la aplicación nativa Soundcloud de WebView
  • Cargar la imagen en caché de WebView en un ImageView
  • Android: EventHub.removeMessages (int what = 107) no es compatible antes de que se configure WebViewCore
  • Sube la foto de la cámara y el archivador de archivos desde el campo INPUT de la vista web
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.