Android: Cómo comprobar la carga exitosa de url al usar webview.loadUrl

En webview android estoy tratando de cargar un url y con el fin de comprobar si la carga de este url se realiza con éxito (conexión a Internet estaba disponible, el servidor estaba en marcha, etc) Tenía la impresión de que webview.loadUrl lanzaría excepciones, pero ¡incorrecto! Como se indica explícitamente aquí "no se lanzará una excepción".

Entonces, ¿cómo puedo comprobar si webview.loadUrl no falló?

Desafortunadamente, actualmente no hay una forma fácil en WebView para asegurar que todo en la página se ha cargado correctamente. Esperamos que una API mejor aparezca en la versión futura. Déjame explicarte lo que puedes hacer ahora.

En primer lugar, para detectar cualquier problema que impida que WebView establezca una conexión con el servidor para cargar la página principal (por ejemplo, nombre de dominio incorrecto, error de E / S, etc.), debería utilizar la WebViewClient.onReceivedError devolución de llamada WebViewClient.onReceivedError como otras personas Sugerir correctamente:

 public class MyWebViewClient extends WebViewClient { @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // Make a note about the failed load. } } myWebView.setWebViewClient(new MyWebViewClient()); 

Si la conexión al servidor se realizó correctamente y la página principal se recuperó y analizó, recibirá la WebView.onPageFinished llamada WebView.onPageFinished , por lo que también deberá tenerla en su subclase WebViewClient :

 public class MyWebViewClient extends WebViewClient { ... @Override public void onPageFinished(WebView view, String url) { // Make a note that the page has finished loading. } ... } 

La advertencia aquí es que si ha recibido un error HTTP del servidor (por ejemplo, un error 404 o 500), esta llamada de retorno se llamará de todos modos, es sólo el contenido que obtendrá en su WebView será una página de error del servidor. Las personas sugieren diferentes formas de cómo tratar con él, vea las respuestas aquí: ¿Cómo puedo comprobar desde Android WebView si una página es una "página no encontrada 404"? Básicamente, realmente depende de lo que usted espera ser una página "buena" y una página de "error". Desafortunadamente, actualmente no hay forma de que la aplicación obtenga el código de respuesta HTTP de WebView.

Las devoluciones de llamada WebViewClient.onPageStarted y WebViewClient.onProgressChanged sólo son útiles si desea dibujar una barra de progreso mientras carga la página.

También tenga en cuenta que la forma de reemplazar WebViewClient.shouldOverrideUrlLoading que la gente suele sugerir no es correcta:

 public class MyWebViewClient extends WebViewClient { ... @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // !!! DO NOT DO THIS UNCONDITIONALLY !!! view.loadUrl(url); return true; } ... } 

Lo que pocos desarrolladores se dan cuenta es que la devolución de llamada también se llama para subtramas con esquemas no-https. Si encuentras algo como <iframe src='tel:1234'> , terminarás ejecutando view.loadUrl('tel:1234') y tu aplicación mostrará una página de error, ya que WebView no sabe cómo Cargar una tel: URL. Se recomienda simplemente devolver falso del método, si desea que WebView realice la carga:

 public class MyWebViewClient extends WebViewClient { ... @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // Returning 'false' unconditionally is fine. return false; } ... } 

Esto no significa que no debería llamar a WebView.loadUrl de shouldOverrideUrlLoading en absoluto. El patrón específico a evitar es hacerlo incondicionalmente para todas las URL.

 public class AppWebViewClient extends WebViewClient { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { // TODO Auto-generated method stub super.onPageStarted(view, url, favicon); setProgressBar(true); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { //Page load finished super.onPageFinished(view, url); setProgressBar(false); } } 

Y entonces usted puede hacer

 webView.setWebViewClient(new AppWebViewClient()); 

Para la parte de error, puede sobrescribir el método onReceivedError

 @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // TODO Auto-generated method stub super.onReceivedError(view, errorCode, description, failingUrl); } 

Puede comprobar si una URL se carga correctamente mediante onProgressChanged()

 mWebView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { progressBar.setProgress(progress); if (progress == 100) { //your url is loaded successfully } } }); 
  • Inserte instagram en Android WebView
  • Android 4.4 dando ERR_CACHE_MISS error en onReceivedError para WebView volver
  • ¿Por qué Android WebView no está cargando youtube HTML5 iframe video?
  • Vista web de Android a veces no carga imágenes
  • Enlaces internos básicos no funcionan en la aplicación de nido de abeja?
  • ShouldInterceptRequest en Android 4.4 KitKat
  • Android WebView desplácese hacia abajo
  • Teclado suave de Android no panorámico vista web
  • ¿Cómo desactiva webview una vez adjunto?
  • Webview guardar el problema de rotación de contraseña
  • WebView en un fragmento (android.support.v4)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.