Comment savoir si mon WebView est chargé à 100%?

J’essaie de charger dans mon WebView du code HTML contenant du JavaScript.

Maintenant, je veux tester si mon WebView est chargé avant 5 secondes. J’ai essayé la méthode getProgress() , mais parfois je constate que la progression est de 100, mais ma vue Web n’est pas chargée.
Existe-t-il un autre moyen de s’assurer que ma vue Web est chargée à 100%?

Ceci fait partie de mon code:

 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); 

Comme dit ici: Comment écouter un WebView finissant de charger une URL?

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

Vous devez remplacer le onPageFinished de WebViewClient

Voici un exemple pour vous

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

Vous pouvez essayer d’étendre WebChromeClient, remplacer onProgressChanged(WebView view, int newProgress) et l’enregistrer sur votre méthode WebView avec setWebChromeClient(WebChromeClient) . Cela libérera votre application du thread supplémentaire que vous commencez juste pour vérifier si les progrès ont changé. Utilisez le rappel, c’est plus simple. Ce serait donc la première chose.

Un autre est que j’expérimentais aussi ce statut de progrès et je suis arrivé à des conclusions sur la façon dont il se comporte:

  • pour certains cas d’utilisation (comme vérifier si la page est même sous l’URL donnée), elle doit être supérieure à 10. Lorsque WebView établit la connexion à l’URL fournie, la valeur de progression est automatiquement définie sur 10, même si connexion réussie, si elle est supérieure à 10, alors vous pouvez être sûr que l’URL pourrait être accessible et le chargement a commencé,
  • la progression sera renvoyée à 100% lorsque vous appelez stopLoading() sur votre WebView,
  • gardant à l’esprit le point précédent lorsque WebView ne pourra pas charger le site complet (il obtiendra un délai d’attente pour une image par exemple), il indiquera alors que la page a été entièrement chargée (100%)

En résumé, cette barre de progression indique si WebView a fini de charger le site ou non, mais en termes de WebKit, pas en termes de téléchargement complet de la page. Vous devez garder à l’esprit que la connexion peut tomber en panne, les ressources (images, css, js) peuvent ne pas se charger pour une raison quelconque, JavaScript peut charger plus de ressources lorsque la page se charge de charger, etc. le contenu était entièrement chargé ou non, il vous dit que WebView pense que tout devrait être.

Je n’ai pas d’autres idées sur la façon de vérifier si la page était complètement chargée ou pas, je pense que c’est la seule façon.

Les solutions ci-dessus n’ont pas fonctionné pour moi, je voulais m’assurer que j’ai chargé 100% de page et ensuite injecter le javascript pour faire des recherches intensives sur la page. Je suis venu avec la solution suivante avec peu de déviation de la solution fournie par NeTeInStEiN. Cela peut ne pas fonctionner pour tout le monde mais cela a fonctionné pour moi. Encore une fois, cela dépend de ce que vous essayez d’atteindre à partir de la page terminée.

 Ssortingng 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, Ssortingng paramSsortingng, Bitmap paramBitmap) { super.onPageStarted(paramWebView, paramSsortingng, paramBitmap); if(paramSsortingng.contentEquals(url)) { webViewPreviousState = PAGE_STARTED; } else { webViewPreviousState = PAGE_REDIRECTED; } // DO YOU STUFF IF NEEDED } public void onPageFinished(WebView paramWebView, Ssortingng paramSsortingng) { 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 } } 

J’espère que cela t’aides.

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

Le code ci-dessous fonctionne parfaitement. Une fois la page chargée, elle se déclenchera surPageFinished ()

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

La meilleure façon de détecter si une page a été rendue est d’utiliser le rappel onPageCommitVisible , disponible à partir de l’API 23. onPageLoadFinished n’est pas adapté, car il est livré trop tôt (lorsque le HTML est traité, mais pas encore rendu).

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