2011-04-07 24 views
26

Quiero saber cómo determinar cuando un WebView es completamente hecho de cargar.¿Cómo determinar cuándo se ha terminado de cargar Android WebView?

Permítanme definir completamente.

  • Todas las redirecciones han sucedido
  • La página se muestra visiblemente, nada todavía tiene que cargar

Malas respuestas a esta pregunta:

WebViewClient.onPageFinished() - esto dispara múltiples veces si hay redirecciones cargando una página. También se dispara antes de que se muestre la página.

PictureListener.onNewPicture() - esto dispara cada vez que la pantalla cambia y AFAICT cada redirección. ¿Cómo sabría qué disparo es el último?

WebChromeClient.onProgressChanged() - el mismo problema que onPageFinished. (Agregado después de que David sugirió esta solución a continuación)

Thread.sleep(5000) - debe ser obvio, por qué esto no es aceptable.

Por supuesto, una combinación inteligente de lo anterior que funciona sería perfecta.

¿Por qué quiero saber esto? Porque quiero para inyectar algo de JavaScript una vez una vez que la vista web es completamente hecho de cargar.

+1

Agregando a su 'WebViewClient.onPageFinished()' "mala respuesta": Según [esto] (http://stackoverflow.com/a/5172952/725417), disparará varias veces ** también ** si tienes varios iframes en una página. – uTubeFan

+0

@Carlos Man estoy exactamente en la misma posición que tú.Lo único que empeora mi situación es que PictureListener está en desuso. ¿Pudiste encontrar una solución? Tengo que calcular el número total de páginas en la vista web para las que necesito dividir el ancho del contenido con el ancho de la pantalla. Pero no puedo hacer eso hasta que la página esté completamente renderizada en la pantalla. Alguna solución? –

+0

@ArunavhKrishnan Bueno, la última vez que miré esto fue hace 3 años. Al final, creo que hice algo similar a la respuesta aceptada. ¡Buena suerte! –

Respuesta

8

Gracias a David Caute por su sugerencia de mirar los encabezados de respuesta.

que he encontrado lo siguiente que funciona bastante bien:

En lugar de tener vistaweb realizar las peticiones HTTP, haces lo mismo por lo que se puede comprobar el código de estado HTTP para redirecciones. Sigue la cadena de redirección. Cuando llegue a una solicitud que no sea una redirección, establezca un indicador y envíe los datos a la vista web a través del webview.loadDataWithBaseURL. La bandera está marcada en WebViewClient.onPageFinished() por lo que sabe que todas las redirecciones están completas. El javascript puede ser inyectado en este punto. Por supuesto, la página en sí podría estar haciendo algo de manipulación de javascript en este punto, es difícil de saber, por lo que agregar un retraso (digamos 500 ms) al javascript permite que el DOM se instale. setTimeout(function(){/* your code */}, 500).

+1

¡Es útil saber! En cuanto al javascript de la página, es difícil de detectar cuando eso ha terminado. –

+1

@Carlos Rendon +1 para un gran esquema. Me sorprende que esto no se implemente en WebView ni en ninguna de sus interfaces satelitales. Esta función es muy necesaria, pero lo único que la gente de WebView ha podido hacer es desaprobar el PictureListener. ¿Alguna idea de por qué? – uTubeFan

+0

Y mientras tanto, resulta que no soy el único que sueña con [acceder a los encabezados de respuesta http en un WebView] (http://stackoverflow.com/questions/3134389/access-the-http-response-headers -in-a-webview). – uTubeFan

1

¿Ha considerado configurar su propio WebChromeClient?

Parece que onProgressUpdated podría informarle cuando una página se ha cargado por completo.

Este parece ser el método utilizado por el navegador integrado de Android.

+0

Gracias por la sugerencia. Desafortunadamente, esto tiene el mismo problema que WebViewClient.onPageFinished(), se dispara varias veces debido a los redireccionamientos. Por ejemplo, en "gmail.com", se dispara 3 veces con progreso == 100. –

+1

¿Cuándo entra el próximo valor de 0 para el progreso? Si se activa inmediatamente después de que una respuesta genera un redireccionamiento, puede ser seguro usar un tiempo de espera y asumir que está en la última solicitud. De lo contrario, estaría buscando una manera de obtener encabezados de respuesta o algo similar. –

Cuestiones relacionadas