onPageStart вызывается много раз, а onPageFinished не вызывается для одной страницы

Мой вопрос отличается от этого, ребята. Я хочу, чтобы мой диалог прогресса начинался, когда начинается загрузка страницы и закончиться, когда загрузка страницы завершится в моем веб-просмотре. Моя проблема заключается в том, что диалоговое окно прогресса запускается и никогда не закрывается. Я установил точки останова, которые показывают, что диалоговое окно прогресса запускается и закрывается много раз, а затем запускается и не закрывается даже после завершения загрузки страницы. Мой вопрос: почему onPageStarted выполняется много раз для загрузки одной страницы? и почему onPageFinished не вызывается после завершения загрузки страницы?

       myWebView.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            myWebView.loadUrl(url);
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(myWebView, url, favicon);
            Log.d("mytag","Page Loading Started");
            //myURLProgressDialog= ProgressDialog.show(WebviewExampleActivity.this, "Page Loading", "Wait for a moment...");
        }
        @Override
        public void onPageFinished(WebView view, String url) {
            Log.d("mytag","Page Loading Finished!");
            super.onPageFinished(myWebView, url);
            //myURLProgressDialog.dismiss();
        }

    });

Мой отфильтрованный журнал с собственной маркировкой похож на это для загрузки одной страницы:

   10-06 10:32:49.298: DEBUG/mytag(508): Page Loading Started
   10-06 10:32:49.998: DEBUG/mytag(508): Page Loading Started
   10-06 10:32:50.048: DEBUG/mytag(508): Page Loading Finished!
   10-06 10:32:50.048: DEBUG/mytag(508): Page Loading Started
   10-06 10:33:00.898: DEBUG/mytag(508): Page Loading Finished!

Когда я нажимаю ссылку на уже загруженной странице, она работает нормально. Вот журнал:

10-06 10:59:25.098: DEBUG/mytag(543): Page Loading Started
10-06 10:59:30.889: DEBUG/mytag(543): Page Loading Finished!

person Mahendran    schedule 06.10.2011    source источник
comment
Я думаю, что для shouldOverrideUrlLoading будет точнее не загружать URL-адрес и просто вернуть false. См. это руководство Якоба Дженкова. понятное объяснение этому.   -  person ComDubh    schedule 31.07.2015


Ответы (5)


Проверьте, не открыт ли он уже с помощью .isShowing().

final ProgressDialog mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("Loading...");

browser.setWebViewClient(new myViewClient(){

    @Override  
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);

        if(!mProgressDialog.isShowing())
        {
            mProgressDialog.show();
        }

    }  
    @Override  
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);

        if(mProgressDialog.isShowing()){
            mProgressDialog.dismiss();
        }                
    }              

});
person capdragon    schedule 11.11.2012
comment
Это сработало для меня (спасибо!), но все еще кажется странным, что каждый вызов onPageStarted не имеет соответствующего вызова PageFinished. - person ComDubh; 31.07.2015

Если у вас есть вызовы ajax на загружаемой странице, onPageFinished() будет вызываться только после завершения этих вызовов. Лучше делать эти вызовы с помощью window.setTimeout(). В этом случае поток пользовательского интерфейса не будет блокироваться для этих вызовов, а onPageFinished() будет вызываться, как только загрузится главная страница.

person tarkeshwar    schedule 23.02.2012
comment
window.setTimeout() можете ли вы объяснить, как это сделать? - person Amit Hooda; 14.11.2017
comment
Как это сделать? - person c0dehunter; 30.11.2018

Иногда бывает так, что при загрузке начальной страницы какой-то скрипт делает редирект (потому что ему нужен идентификатор сеанса или что-то, что заставило бы страницу загрузиться снова).

Вы можете проверить, загружается ли другая страница (или та же самая с дополнительными параметрами), зарегистрировав параметр url.

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

person htafoya    schedule 28.05.2012

Вот решение. Вместо диалога загрузки я использую другое веб-представление в качестве заставки, но вы можете легко изменить его.

Хитрость заключается в том, чтобы посмотреть, есть ли новый «onpagestart» сразу после «onpagefinished». Если это так, не закрывайте загрузку и ждите следующего "onpagefinished".

myWebView.setWebViewClient(new WebViewClient() {
    boolean loadingFinished = true;
    boolean redirect = false;

    long last_page_start;
    long now;

    // Load the url
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (!loadingFinished) {
            redirect = true;
        }

        loadingFinished = false;
        view.loadUrl(url);
        return false;
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        Log.i("p","pagestart");
        loadingFinished = false;
        last_page_start = System.nanoTime();
        show_splash();
    }

    // When finish loading page
    public void onPageFinished(WebView view, String url) {
        Log.i("p","pagefinish");
        if(!redirect){
            loadingFinished = true;
        }
        //call remove_splash in 500 miSec
        if(loadingFinished && !redirect){
            now = System.nanoTime();
            new android.os.Handler().postDelayed(
                    new Runnable() {
                        public void run() {
                            remove_splash();
                        }
                    },
                    500);
        } else{
            redirect = false;
        }
    }
    private void show_splash() {
        if(myWebView.getVisibility() == View.VISIBLE) {
            myWebView.setVisibility(View.GONE);
            myWebView_splash.setVisibility(View.VISIBLE);
        }
    }
    //if a new "page start" was fired dont remove splash screen
    private void remove_splash() {
        if (last_page_start < now) {
            myWebView.setVisibility(View.VISIBLE);
            myWebView_splash.setVisibility(View.GONE);
        }
    }

});
person EscapeNetscape    schedule 19.05.2015

Когда страница отправляется в приложение веб-просмотра: onPageStarted Fired, но onPageFinished не Fired, поэтому следуйте приведенному ниже коду, исправленному и точному

    ProgressDialog pd = null;

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        if(pd == null || !pd.isShowing()) {
            pd = new ProgressDialog(MainActivity.this);
            pd.setTitle("Please wait");
            pd.setMessage("App is loading...");
            pd.show();
        }
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        if (pd != null) {
            pd.dismiss();
        }
    }
person Cuong Nguyen    schedule 17.01.2017