onPageStart вызывается много раз, а onPageFinished не вызывается для одной страницы - PullRequest
10 голосов
/ 06 октября 2011

Мой вопрос отличается от этого одного парня .. Я хочу, чтобы мой диалог прогресса начинался, когда загрузка страницы начиналась, и заканчивался, когда загрузка страницы заканчивалась в моем веб-просмотре.Моя проблема в том, что диалоговое окно прогресса запускается и никогда не закрывается. Я установил точки останова, которые показывают, что диалоговое окно прогресса запускается и закрывается много раз, а затем запускается и не закрывается даже после завершения загрузки страницы.Мой вопрос, почему 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!

Ответы [ 5 ]

6 голосов
/ 12 ноября 2012

Проверьте, открыт ли он уже с .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();
        }                
    }              

});
5 голосов
/ 23 февраля 2012

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

0 голосов
/ 17 января 2017

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

    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();
        }
    }
0 голосов
/ 19 мая 2015

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

Хитрость в том, чтобы посмотреть, есть ли новый "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);
        }
    }

});
0 голосов
/ 28 мая 2012

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

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

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

...