2011-10-06 13 views
9

La mia domanda è diversa da this un ragazzo .. I wany la mia finestra di avanzamento inizia quando il caricamento della pagina inizia e termina quando il caricamento della pagina termina nella mia webview. Il mio problema è che la finestra di dialogo dell'avvio inizia e non viene mai ignorata. Ho impostato i punti di interruzione per mostrare che la finestra di dialogo dell'avvio si avvia e viene chiusa più volte, quindi inizia e non viene chiusa anche dopo il caricamento della pagina. La mia domanda è: perché onPageStarted viene eseguito più volte per il caricamento di una singola pagina? e perché onPageFinished non viene chiamato dopo il completamento del caricamento della pagina?onPageStart chiamato molte volte e onPageFinished non chiamato per singola pagina

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

    }); 

My self etichettato filtrato Log è così per il caricamento di pagina singola:

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! 

Quando sto cliccando sul link a pagina già caricata funziona benissimo. Ecco 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

Penso che sia più accurato per 'non shouldOverrideUrlLoading' per caricare l'URL e semplicemente restituire 'false'. Vedi [questo tutorial di Jakob Jenkov] (http://tutorials.jenkov.com/android/android-web-apps-using-android-webview.html) per una chiara spiegazione di ciò. – ComDubh

risposta

4

Se hai chiamate ajax nella pagina viene caricata, onPageFinished saranno chiamati() solo quando quelle chiamate finiscono. Meglio effettuare quelle chiamate con window.setTimeout(). In tal caso, il thread dell'interfaccia utente non verrà bloccato su quelle chiamate e onPageFinished() verrà chiamato non appena viene caricata la pagina principale.

+0

window.setTimeout() puoi spiegare come farlo? –

0

A volte accade che quando viene caricata la pagina iniziale, alcuni script eseguono un reindirizzamento (perché aveva bisogno di un ID di sessione, o qualcosa che avrebbe ricaricato la pagina).

È possibile verificare se una pagina diversa (o la stessa con parametri aggiuntivi) viene caricata registrando il parametro url.

Immagino che se una nuova richiesta di caricamento viene eseguita prima del completamento della prima pagina, il metodo OnPageFinished non verrà chiamato per quella prima pagina.

6

Verificare se è già aperto 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

Questo ha funzionato per me (grazie!) Ma sembra ancora strano che ogni invocazione di 'onPageStarted' non sembra avere un corrispondente sull'invocazione' PageFinished'. – ComDubh

0

Ecco una soluzione. Invece di una finestra di caricamento, utilizzo un'altra vista Web come splash-screen, ma puoi cambiarla facilmente.

Il trucco è, per vedere se c'è un nuovo "onpagestart" subito dopo "onpagefinished". Se questo è il caso, non chiudere il caricamento e attendere il prossimo "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

Quando una pagina presentare su App WebView: onPageStarted licenziato, ma non onPageFinished Fired in modo da seguire il codice qui sotto fisso ed esattamente

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