Как я могу узнать, что мой WebView загружен на 100%? - PullRequest
50 голосов
/ 01 июня 2011

Я пытаюсь загрузить в мой WebView некоторый HTML-код, содержащий JavaScript.

Теперь я хочу проверить, загружен ли мой WebView до 5 секунд.Я попробовал метод getProgress(), но иногда получаю, что прогресс равен 100, но мое веб-представление не загружено.
Есть ли другой способ убедиться, что мое веб-представление загружено на 100%?

Это часть моего кода:

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

Ответы [ 8 ]

79 голосов
/ 01 июня 2011

Как сказано здесь: Как прослушать WebView для завершения загрузки 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; 
       }

    }
});
7 голосов
/ 23 февраля 2018

Лучший способ определить, визуализировалась ли страница, - это использовать обратный вызов onPageCommitVisible , доступный из API 23. onPageLoadFinished не подходит, поскольку он доставляется слишком рано (когда обрабатывается HTML, но нееще вынесено).

webview.setWebViewClient(new WebViewClient() {

    @Override
     public void onPageCommitVisible (WebView view, 
            String url)
    }
}
6 голосов
/ 01 июня 2011

Вам нужно перезаписать onPageFinished из WebViewClient

Вот пример для вас

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

        }


}
3 голосов
/ 27 апреля 2017
webView.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress) {
                if (progress == 100) {
                    //do your task

                }
            }
        });
3 голосов
/ 01 июня 2011

Вы можете попробовать расширить WebChromeClient, переопределить onProgressChanged(WebView view, int newProgress) и зарегистрировать его в WebView с помощью метода setWebChromeClient(WebChromeClient). Это освободит ваше приложение от дополнительного потока, который вы запускаете, просто чтобы проверить, изменился ли прогресс. Воспользуйтесь обратным вызовом, это проще. Так что это было бы первым делом.

Еще одно - я тоже экспериментировал с этим статусом прогресса и пришел к некоторым выводам о том, как он себя ведет:

  • для некоторых случаев использования (таких как проверка, находится ли страница даже под заданным URL-адресом), оно должно быть больше 10. Когда WebView устанавливает соединение с предоставленным URL-адресом, он автоматически устанавливает значение прогресса равным 10, даже если он это сделал. не установить успешное соединение, если оно больше 10, то вы можете быть уверены, что URL-адрес будет доступен и загрузка начнется,
  • Прогресс будет возвращен как 100% при вызове stopLoading() в вашем WebView,
  • Имея в виду предыдущую точку зрения, также, когда WebView не сможет загрузить полный сайт (например, для изображения получится тайм-аут), он сообщит, что страница была полностью загружена (100%)

Подводя итог, можно сказать, что этот индикатор выполнения показывает, завершил ли WebView загрузку сайта или нет, но с точки зрения WebKit, а не с точки зрения загрузки страницы полностью. Вы должны иметь в виду, что соединение может оборваться, ресурсы (изображения, CSS, JS) могут не загружаться по какой-то причине, JavaScript может загрузить некоторые дополнительные ресурсы, когда страница завершит загрузку и т. Д., Этот прогресс не может сказать вам, если сайты контент был полностью загружен или нет, он говорит вам, что WebView считает, что это должно быть все.

У меня нет других идей о том, как проверить, была ли страница полностью загружена или нет, я думаю, что это единственный способ.

2 голосов
/ 13 июля 2012

Вышеуказанные решения не работали для меня, я хотел убедиться, что страница загружена на 100%, а затем внедрить javascript, чтобы провести некоторое интенсивное исследование страницы.Я пришел к следующему решению с небольшим отклонением от решения, предоставленного NeTeInStEiN.Это может не работать для всех, но это работает для меня.Опять же, это зависит от того, чего вы пытаетесь достичь на готовой странице.

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

Надеюсь, что это поможет.

1 голос
/ 25 ноября 2018

Установка WebChromeClient для WebView Другой способ определить, когда заканчивается загрузка страницы

            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();
            }
                }
            });
0 голосов
/ 20 октября 2017

Код ниже работает отлично.Как только страница была успешно загружена, она вызовет onPageFinished ()

        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);
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...