¿Cómo puedo saber que mi WebView está cargado al 100%?

Estoy intentando cargar en mi WebView algún código HTML que contenga JavaScript.

Ahora, quiero probar si mi WebView se carga antes de 5 segundos. getProgress() el método getProgress() , pero a veces veo que el progreso es 100, pero mi vista web no está cargada.
¿Hay alguna otra manera de estar seguro de que mi Webview está cargada al 100%?

Esto es parte de mi código:

 sdk.getWebView().loadDataWithBaseURL("notreal/", data_html,MIME_TYPE,ENCODING_UTF_8,null); Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run(){ Log.i("TAG", "progress fin = "+sdk.getWebView().getProgress()); if(sdk.getWebView().getProgress() <100){ //cancel the webView sdk.getContext().runOnUiThread(new Runnable() { @Override public void run() { sdk.getImgView().setVisibility(View.VISIBLE); sdk.getWebView().setVisibility(View.GONE); } }); } // else ,the Webview is loaded else{ //prepare webview sdk.getContext().runOnUiThread(new Runnable() { @Override public void run(){ // hide imageView sdk.getImgView().setVisibility(View.GONE); sdk.getWebView().setVisibility(View.VISIBLE); } }); } } }; timer.schedule(task, 5000); 

Como dije aquí: ¿Cómo escuchar un WebView terminando de cargar una URL?

 boolean loadingFinished = true; boolean redirect = false; mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) { if (!loadingFinished) { redirect = true; } loadingFinished = false; view.loadUrl(urlNewString); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap facIcon) { loadingFinished = false; //SHOW LOADING IF IT ISNT ALREADY VISIBLE } @Override public void onPageFinished(WebView view, String url) { if(!redirect){ loadingFinished = true; } if(loadingFinished && !redirect){ //HIDE LOADING IT HAS FINISHED } else{ redirect = false; } } }); 

Necesita sobrescribir el onPageFinished de WebViewClient

Aquí hay un ejemplo para ti

 private class Callback extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); //do what you want to do } } 

Puede intentar extender WebChromeClient, anular onProgressChanged(WebView view, int newProgress) y registrarlo en su WebView con el setWebChromeClient(WebChromeClient) . Esto liberará su aplicación del hilo adicional que está comenzando solo para verificar si el progreso ha cambiado. Use la callback, es más simple. Entonces eso sería lo primero.

Otra es que también estaba experimentando con este estado de progreso y llegué a algunas conclusiones sobre cómo se comporta:

  • para algunos casos de uso (como comprobar si la página está incluso debajo de la url dada) tiene que ser mayor que 10. Cuando WebView realiza la conexión a la url proporcionada, establece automáticamente el valor de progreso en 10, incluso si no hizo una conexión exitosa, si es mayor que 10, entonces puede estar seguro de que se puede acceder a la url y la carga ha comenzado,
  • el progreso se devolverá al 100% cuando llame a stopLoading() en su WebView,
  • teniendo en cuenta el punto anterior también cuando WebView no podrá cargar el sitio completo (obtendrá un tiempo de espera para una imagen, por ejemplo) y luego informará que la página se cargó por completo (100%)

En resumen, esta barra de progreso es un indicador de si WebView ha terminado de cargar el sitio o no, pero en términos de WebKit no en términos de página que se descarga completamente. Debe tener en cuenta que la conexión puede fallar, los recursos (imágenes, css, js) pueden no cargarse por alguna razón, JavaScript puede cargar más recursos cuando la página termine de cargar, etc. Este progreso no le puede decir si los sitios el contenido estaba completamente cargado o no, te dice que WebView piensa que esto debería ser todo.

No tengo otras ideas sobre cómo verificar si la página está completamente cargada o no, creo que esta es la única manera.

Las soluciones anteriores no me funcionaron, quería asegurarme de tener la página cargada al 100% y luego inyectar javascript para realizar una investigación exhaustiva en la página. Se me ocurrió la siguiente solución con poca desviación de la solución proporcionada por NeTeInStEiN. Esto puede no funcionar para todos, pero funcionó para mí. De nuevo, depende de lo que intenta lograr desde la página final.

 String url; is from your activity which want to load this url private class ExtendedWebViewClient extends WebViewClient { private int webViewPreviousState; private final int PAGE_STARTED = 0x1; private final int PAGE_REDIRECTED = 0x2; public void onPageStarted(WebView paramWebView, String paramString, Bitmap paramBitmap) { super.onPageStarted(paramWebView, paramString, paramBitmap); if(paramString.contentEquals(url)) { webViewPreviousState = PAGE_STARTED; } else { webViewPreviousState = PAGE_REDIRECTED; } // DO YOU STUFF IF NEEDED } public void onPageFinished(WebView paramWebView, String paramString) { if (webViewPreviousState == PAGE_STARTED) { // I AM GETTING HERE WHEN MY PAGE IS LOADED 100% // NOW ITS TIME FOR ME TO RUN JAVASCRIPT FUNCTIONS // DO YOUR STUFF } } 

Espero que esto ayude.

 webView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { if (progress == 100) { //do your task } } }); 

El siguiente código funciona perfectamente. Una vez que la página se haya cargado correctamente, se activará en PageFinished ()

  webView.setWebViewClient(new WebViewClient(){ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Toast.makeText(getApplicationContext(),"Started",Toast.LENGTH_SHORT).show(); super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { Toast.makeText(getApplicationContext(),"Loaded",Toast.LENGTH_SHORT).show(); super.onPageFinished(view, url); } }); 

La mejor forma de detectar si una página se ha renderizado es utilizar la callback onPageCommitVisible , disponible desde API 23. onPageLoadFinished no es adecuado, ya que se entrega demasiado pronto (cuando se procesa el HTML, pero aún no se procesa).

 webview.setWebViewClient(new WebViewClient() { @Override public void onPageCommitVisible (WebView view, String url) } }