Подтвердить что ты не робот

Как узнать, что мой WebView загружен на 100%?

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

Теперь я хочу проверить, загружен ли мой WebView до 5 секунд. Я пробовал метод getProgress(), но иногда я получаю, что прогресс составляет 100, но мой Webview не загружен.
Есть ли другой способ убедиться, что мой веб-просмотр загружен на 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);
4b9b3361

Ответ 1

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

    }
});

Ответ 2

Вам нужно перезаписать 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

Вы можете попробовать расширить 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 считает, что все должно быть.

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

Ответ 4

Выше решения не работали для меня, я хотел убедиться, что у меня есть страница, загруженная на 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
}
}

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

Ответ 5

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

                }
            }
        });

Ответ 6

Приведенный ниже код работает отлично. Как только страница будет загружена успешно, она активирует 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);
        }
    });