2011-10-06 20 views
9

Mi pregunta es diferente de this one guys .. Espero que mi diálogo de progreso comience cuando la carga de la página comience y finalice cuando la carga de la página haya terminado en mi página web. Mi problema es que el diálogo de progreso comienza y nunca se descarta. He establecido puntos de corte que muestran que el diálogo de progreso comienza y se descarta muchas veces, luego se inicia y no se descarta, incluso después de que se completa la carga de la página. Mi pregunta es por qué el onPageStarted se ejecuta muchas veces para cargar una sola página. y por qué onPageFinished no se llama después de completar la carga de la página?onPageStart llamado muchas veces y onPageFinished no llamado para una sola página

 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(); 
     } 

    }); 

Mi ser etiquetados filtrada Log es como no para cargar una sola página:

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! 

Cuando estoy clic en enlace en la página ya cargada que trabaja muy bien. Aquí es Log:

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

Creo que es más preciso para 'no shouldOverrideUrlLoading' para cargar la URL y simplemente devuelve 'falso'. Consulte [este tutorial de Jakob Jenkov] (http://tutorials.jenkov.com/android/android-web-apps-using-android-webview.html) para obtener una explicación clara de esto. – ComDubh

Respuesta

4

Si tiene llamadas ajax en la página que se carga, onPageFinished se llamará() sólo cuando terminen esas llamadas. Es mejor hacer esas llamadas con window.setTimeout(). En ese caso, el hilo de UI no se bloqueará en esas llamadas y onPageFinished() se ejecutará tan pronto como se cargue la página principal.

+0

window.setTimeout() ¿Puedes explicarme cómo hacer esto? –

0

A veces sucede que cuando se carga la página inicial, algunas secuencias de comandos realizan una redirección (porque necesitaban una ID de sesión, o algo que haría que la página volviera a cargar).

Puede verificar si una página diferente (o la misma con parámetros adicionales) se está cargando al iniciar sesión en el parámetro url.

Supongo que si se realiza una nueva solicitud de carga antes de que la primera página termine de cargarse, entonces no se llamará al método OnPageFinished para esa primera página.

6

Compruebe si ya está abierto con .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(); 
     }     
    }    

}); 
+1

Esto funcionó para mí (¡gracias!) Pero aún parece extraño que cada invocación de 'onPageStarted' no parezca tener una invocación correspondiente en 'PageFinished'. – ComDubh

0

Aquí hay una solución. En lugar de un cuadro de diálogo de carga, utilizo otra vista web como pantalla secundaria, pero puede cambiarla fácilmente.

El truco es, para ver si hay un nuevo "onpagestart" justo después de la "onpagefinished". Si este es el caso, no cierre la carga y espere el próximo "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

Cuando una página presentar en aplicación vistas web: onPageStarted despedido, pero no onPageFinished Fired así que siga siguiente código fijo y exactamente

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(); 
     } 
    } 
Cuestiones relacionadas