Как узнать, что мой 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);
Ответы
Ответ 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);
}
});