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ó?
- Cómo encajar una página web en la pantalla de Android (webview)?
- Mostrar círculo de actividades antes de cargar la vista web - Android
- Diálogo de carga de la vista web de Android
- Inicio de sesión de Twitter utilizando WebView
- Leer eventos de teclado en Android WebView
- Cargar archivo .HTML local con WebView
- Bloqueo de hilo principal de Android que bloquea hilo de WebView
- Android webview página recarga después de la captura de imagen y cargar en android 5 +
- React-Native: Descarga y carga de archivos desde android webview
- Cómo mejorar el rendimiento de JS menú arrastrar en WebView en Android
- ¿Cómo puedo eliminar el fondo blanco de una vista web?
- Android: Reproducción de un sonido de recursos utilizando WebView
- ¿Cómo abrir la página HTML local en el navegador androide nativo (no en la vista web)?
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 } } });
- Android: ¿Cómo matar por completo a un servicio que se ejecuta por separado como un proceso de fondo?
- Biblioteca de archivos de Android