it-swarm.com.de

Woher weiß ich, dass mein WebView zu 100% geladen ist?

Ich versuche in meinem WebView HTML-Code zu laden, der JavaScript enthält.

Nun möchte ich testen, ob mein WebView vor 5 Sekunden geladen ist. Ich habe die Methode getProgress() ausprobiert, aber manchmal bekomme ich den Fortschritt auf 100, aber mein Webview wird nicht geladen.
Gibt es eine andere Möglichkeit, um sicherzustellen, dass mein Webview zu 100% geladen ist?

Dies ist ein Teil meines Codes:

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

Wie gesagt: Wie hört man auf ein WebView, das das Laden einer URL beendet?

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

Sie müssen die onPageFinished von WebViewClient überschreiben.

Hier ist ein Beispiel für Sie

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

Sie können versuchen, WebChromeClient zu erweitern, onProgressChanged(WebView view, int newProgress) zu überschreiben und es in Ihrer WebView mit der setWebChromeClient(WebChromeClient)-Methode zu registrieren. Dadurch wird Ihre Anwendung von dem zusätzlichen Thread befreit, den Sie gerade starten, um nur zu überprüfen, ob sich der Fortschritt geändert hat. Verwenden Sie den Rückruf, es ist einfacher. Das wäre also das Erste.

Eine andere ist, dass ich auch mit diesem Fortschrittsstatus experimentiert habe und zu einigen Schlussfolgerungen zu dessen Verhalten gekommen bin:

  • für einige Anwendungsfälle (z. B. prüfen, ob sich die Seite sogar unter der angegebenen URL befindet) muss sie größer als 10 sein. Wenn WebView die Verbindung zur angegebenen URL herstellt, wird der Fortschrittswert automatisch auf 10 gesetzt, auch wenn keine Verbindung hergestellt wurde erfolgreiche Verbindung, wenn sie größer als 10 ist, dann können Sie sicher sein, dass auf die URL zugegriffen werden kann und das Laden begonnen hat
  • der Fortschritt wird als 100% zurückgegeben, wenn Sie stopLoading() in Ihrem WebView aufrufen. 
  • unter Berücksichtigung des vorherigen Punktes, auch wenn WebView die vollständige Site nicht laden kann (es wird beispielsweise ein Timeout für ein Bild angezeigt), wird gemeldet, dass die Seite vollständig geladen wurde (100%).

Zusammenfassend lässt sich sagen, dass diese Fortschrittsleiste darauf hinweist, ob WebView die Website vollständig geladen hat oder nicht, jedoch in Bezug auf WebKit, nicht in Bezug auf den vollständig heruntergeladenen Seiteninhalt. Sie müssen bedenken, dass die Verbindung abstürzen kann, Ressourcen (Bilder, CSS, Js) möglicherweise aus irgendeinem Grund nicht geladen werden. JavaScript kann einige weitere Ressourcen laden, wenn die Seite vollständig geladen wird usw. Dieser Fortschritt kann Ihnen nicht sagen, ob die Websites vorhanden sind Der Inhalt wurde vollständig geladen oder nicht, er sagt Ihnen, dass WebView der Meinung ist, dass dies alles sein sollte.

Ich habe keine anderen Ideen, wie man prüfen kann, ob die Seite voll geladen ist oder nicht. Ich denke, das ist der einzige Weg.

3
Maciej Pigulski

Der beste Weg, um herauszufinden, ob eine Seite gerendert wurde, ist die Verwendung von onPageCommitVisible callback, die in API 23 verfügbar ist. OnPageLoadFinished ist nicht geeignet, da sie zu früh geliefert wird (wenn der HTML-Code verarbeitet, aber noch nicht gerendert wurde).

webview.setWebViewClient(new WebViewClient() {

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

Obige Lösungen funktionierten nicht für mich, ich wollte sicherstellen, dass ich die Seite zu 100% geladen habe und anschließend Javascript injiziere, um einige intensive Recherchen auf der Seite durchzuführen. Ich habe folgende Lösung mit wenig Abweichung von der von NeTeInStEiN bereitgestellten Lösung gefunden. Dies kann nicht für alle funktionieren, aber es hat für mich funktioniert. Wieder hängt es davon ab, was Sie von der fertigen Seite erreichen wollen.

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

Hoffe das hilft.

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

                }
            }
        });
2
Rajesh Gauswami

Festlegen eines WebChromeClient für WebView Eine andere Methode zum Bestimmen, wann das Laden der Seite abgeschlossen ist

            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

Der folgende Code funktioniert einwandfrei. Sobald die Seite erfolgreich geladen wurde, wird onPageFinished () ausgelöst. 

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