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

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

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

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

Вам необходимо перезаписать 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 } } 

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

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

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

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

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

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

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

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

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

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

 webview.setWebViewClient(new WebViewClient() { @Override public void onPageCommitVisible (WebView view, String url) } } 
  • Android WebView "tel:" ссылки показывают, что веб-страница не найдена
  • Как получить содержимое веб-страницы из WebView?
  • Отключить прокрутку в веб-просмотре?
  • Настройка WebView для просмотра рабочего стола, а не для мобильного сайта
  • Утечка памяти в WebView
  • обработка ссылок в webview
  • Android WebView, масштабирование изображения в соответствии с экраном
  • При щелчке по URL-адресам открывается браузер по умолчанию
  • Как справиться с базовой аутентификацией в WebView
  • Как обрабатывать языки RTL в версиях Android до 4.2?
  • Давайте будем гением компьютера.