studio android webview webviewclient

webview android studio documentation



¿Qué se considera en PageFinished en Android WebViewClient? (3)

Intento realizar una acción en un Android WebView después de que mi página web termine de cargarse en él. Configuré mi WebView para tener un WebViewClient para hacer uso de la devolución de llamada en el evento onPageFinished. Sin embargo, después de algunas pruebas, parece que no espera hasta que todo el JS en la página termina de cargarse antes de que se dispare mi código onPageFinished.

La documentación de Google dice esto:

public void onPageFinished (WebView view, String url)

Agregado en el nivel de API 1 Notifique a la aplicación de host que una página ha terminado de cargarse. Este método se llama solo para el marco principal. Cuando se llama a onPageFinished (), la imagen de renderizado puede no actualizarse todavía. Para recibir la notificación de la nueva imagen, use onNewPicture (WebView, Picture).

Parámetros

ver el WebView que está iniciando la devolución de llamada.

url La url de la página.

1) ¿onPageFinished solo espera a que DOM se cargue?

2) ¿Hay alguna manera de detectar cuándo termina cualquier JS en la página? Si es así, ¿qué debería usar?

No veo nada en WebViewClient que sea para ese propósito. No quiero agregar un retraso ya que mis usuarios pueden estar en EDGE o en LTE.


Debe implementar las devoluciones de llamada desde WebChromeClient. OnPageFinished () es una API proporcionada por WebViewClient. Hay otra interfaz llamada WebChromeClient que proporciona la información de progreso que está buscando:

http://developer.android.com/reference/android/webkit/WebChromeClient.html#onProgressChanged(android.webkit.WebView , int)

Abra el enlace de arriba y busque onProgressChanged (vista WebView, int newProgress) - la variable ''newProgress'' le da el porcentaje de carga de la página que se completó. Cuando llega a 100, tienes una página válida. onPageFinished () no se puede usar de manera confiable para esto (debido a las redirecciones del lado del servidor, etc.)

No sé a qué te refieres con "cuando JS en la página haya terminado". Tal vez puedas aclarar lo que quieres decir?


Para responder a su primera pregunta: he encontrado que en onProgressChanged no llegará a 100 , y en onPageFinished no se onPageFinished hasta que todos los activos (css / js / images) hayan terminado de cargarse para esa página.

No obstante, no puedo encontrar ninguna documentación oficial que indique eso.


De:

https://chromium.googlesource.com/chromium/src.git/+/master/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java

@Override public void didFinishNavigation(final String url, boolean isInMainFrame, boolean isErrorPage, boolean hasCommitted, boolean isSameDocument, boolean isFragmentNavigation, Integer pageTransition, int errorCode, String errorDescription, int httpStatusCode) { ... if (client != null && isFragmentNavigation) { client.getCallbackHelper().postOnPageFinished(url); } } @Override public void didFailLoad( boolean isMainFrame, int errorCode, String description, String failingUrl) { AwContentsClient client = mAwContentsClient.get(); if (client == null) return; String unreachableWebDataUrl = AwContentsStatics.getUnreachableWebDataUrl(); boolean isErrorUrl = unreachableWebDataUrl != null && unreachableWebDataUrl.equals(failingUrl); if (isMainFrame && !isErrorUrl && errorCode == NetError.ERR_ABORTED) { // Need to call onPageFinished for backwards compatibility with the classic webview. // See also AwContents.IoThreadClientImpl.onReceivedError. client.getCallbackHelper().postOnPageFinished(failingUrl); } } @Override public void didStopLoading(String validatedUrl) { if (validatedUrl.length() == 0) validatedUrl = ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL; AwContentsClient client = getClientIfNeedToFireCallback(validatedUrl); if (client != null && validatedUrl.equals(mLastDidFinishLoadUrl)) { client.getCallbackHelper().postOnPageFinished(validatedUrl); mLastDidFinishLoadUrl = null; } }

Podemos ver fácilmente que onPageFinished no es más o menos lo que estás esperando.