66 votes

Comment savoir que ma WebView est chargée à 100%?

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

Maintenant, je veux tester si ma WebView est chargée avant 5 secondes. J'ai essayé la méthode getProgress() , mais parfois j'obtiens 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);
 

90voto

NeTeInStEiN Points 7331

Comme dit ici: Comment écouter une Webview finissant de charger une URL dans Android?

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

    }
});
 

6voto

Tanmay Mandal Points 13341

Vous devez remplacer le onPageFinished de WebViewClient

Voici un exemple pour vous

 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

        }


}
 

5voto

Maciej Pigulski Points 914

Vous pouvez essayer de l'étendre WebChromeClient, remplacer onProgressChanged(WebView vue, int newProgress) et de l'enregistrer sur votre WebView avec setWebChromeClient(WebChromeClient) de la méthode. Cela permettra de libérer votre application à partir du thread supplémentaire que vous commencent tout juste à vérifier si des progrès ont changé. Utilisez la fonction de rappel, c'est plus simple. Donc, ce serait la première chose.

Un autre est que j'ai été aussi à expérimenter avec cette état d'avancement et je suis arrivé à certaines conclusions sur la façon dont il se comporte:

  • pour certains cas d'utilisation (par exemple, vérifier si la page est encore sous l'url), il doit être supérieur à 10. Lors de la WebView qui rend la connexion à l'url fournie ensuite, il définit automatiquement la valeur de progression de 10, même si il n'a pas une connexion réussie, si elle est supérieure à 10, alors vous pouvez être sûr que l'url d'accès et le chargement a commencé,
  • les progrès seront retournés à 100% lorsque vous appelez stopLoading() sur votre WebView,
  • en gardant le point précédent à l'esprit lors de la WebView ne sera pas en mesure de charger la totalité du site (il obtiendra un délai d'attente pour une image par exemple), alors il rendra compte que la page était en pleine charge (100%)

Pour résumer, cette barre de progression est un indicateur que WebView a fini de charger le site ou pas, mais en termes de WebKit pas dans les termes de la page est complètement téléchargé. Vous devez garder à l'esprit que la connexion peut se bloquer, les ressources (images, css, js) ne peut pas charger pour une raison quelconque, JavaScript peut charger plus de ressources lors de la page de finir le chargement etc. ce progrès ne peux pas vous dire si le contenu des sites a été entièrement chargé ou pas, il vous dit que WebView pense que ce devrait être tout.

Je n'ai pas d'autres idées sur la façon de vérifier si la page a été entièrement chargé ou pas, je pense que c'est le seul moyen.

2voto

mask Points 1673

Les solutions ci-dessus ne fonctionnaient pas pour moi, je voulais m'assurer que la page était chargée à 100%, puis injecter du javascript pour effectuer des recherches intensives sur la page. J'ai trouvé la solution suivante avec peu d'écart par rapport à 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 de réaliser à partir de la page terminée.

 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
}
}
 

J'espère que cela t'aides.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X