web-dev-qa-db-fra.com

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 mon WebView est chargé avant 5 secondes. J'ai essayé la méthode getProgress(), mais il m'arrive parfois de constater que l'avancement est égal à 100, mais ma vue Web n'est pas chargée.
Existe-t-il un autre moyen de s’assurer que ma Webview est chargée à 100%?

Ceci est une 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);
48
Houcine

Comme dit ici: Comment écouter une WebView finissant de charger une 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; 
       }

    }
});
76
neteinstein

Vous devez écraser la 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

        }


}
6
Tanmay Mandal

Vous pouvez essayer d'étendre WebChromeClient, substituer onProgressChanged(WebView view, int newProgress) et l'enregistrer sur votre méthode WebView avec la méthode setWebChromeClient(WebChromeClient). Cela libérera votre application du thread supplémentaire que vous démarrez simplement pour vérifier si la progression a changé. Utilisez le rappel, c'est plus simple. Donc, ce serait la première chose.

En outre, j’expérimentais également ce statut de progrès et j’en suis arrivé à des conclusions sur son comportement:

  • pour certains cas d'utilisation (par exemple, vérifier si la page se trouve sous l'URL donnée), elle doit être supérieure à 10. Lorsque WebView établit la connexion à l'URL fournie, il définit automatiquement la valeur de progression sur 10 même s'il n'a pas effectué de modification connexion réussie, si elle est supérieure à 10, vous pouvez être sûr que l’URL est accessible et que le chargement a commencé,
  • la progression sera renvoyée à 100% lorsque vous appelez stopLoading() sur votre WebView, 
  • en gardant à l'esprit le point précédent également lorsque WebView ne peut pas charger le site complet (par exemple, le délai d'attente d'une image est dépassé), il indique 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 et non en termes de téléchargement complet de la page. N'oubliez pas que la connexion peut se bloquer, que les ressources (images, css, js) risquent de ne pas se charger pour une raison quelconque, que JavaScript peut charger d'autres ressources lorsque la page se terminera, etc. cette progression ne permet pas de savoir si le contenu était entièrement chargé ou non, cela vous indique que WebView pense que cela devrait être tout.

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

3
Maciej Pigulski

Le meilleur moyen de détecter si une page a été rendue est d'utiliser le onPageCommitVisible callback, disponible à partir de l'API 23. onPageLoadFinished n'est pas approprié car il est livré trop tôt (lorsque le code HTML est traité, mais pas encore rendu).

webview.setWebViewClient(new WebViewClient() {

    @Override
     public void onPageCommitVisible (WebView view, 
            String url)
    }
}
3
Daniel Novak

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. 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 de la page finie.

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.

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

                }
            }
        });
2
Rajesh Gauswami

Définition d'un WebChromeClient pour WebView Autre moyen de déterminer le moment du chargement de la page

            mWebView.setWebChromeClient(new WebChromeClient(){
                /*public void onProgressChanged (WebView view, int newProgress)           Tell the Host application the current progress of loading a page.

                    Parameters
                        view WebView: The WebView that initiated the callback.

                        newProgress int: Current page loading progress, represented by an
                            integer between 0 and 100.
                */
                public void onProgressChanged(WebView view, int newProgress){
                    Toast.makeText(getActivity().getApplicationContext(),"Page loading : " + newProgress + "%",Toast.LENGTH_SHORT).show();

            if(newProgress == 100){
                // Page loading finish
                Toast.makeText(getActivity().getApplicationContext(),"Page loaded",Toast.LENGTH_SHORT).show();
            }
                }
            });
1
Shahbaz Ali

Le code ci-dessous fonctionne parfaitement. Une fois la page chargée avec succès, onPageFinished () se déclenchera 

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