2011-10-06 20 views
9

我的問題是this一個傢伙不同 我wany我的進度對話框開始時頁面加載開始和結束時,在我的web視圖加載完成頁面。我的問題是進度對話框開始,永遠不會被解僱。我已經設置了斷點,它表明進度對話框開始並被多次解僱,然後開始並且甚至在頁面加載完成後也不被解僱。我的問題是爲什麼onPageStarted爲單個頁面加載執行多次? 以及爲什麼在頁面加載完成後不調用onPageFinished?onPageStart打了很多次,並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! 
+0

我覺得它更準確的'shouldOverrideUrlLoading'不加載URL和只需返回'false'。請參閱[本教程由Jakob Jenkov](http://tutorials.jenkov.com/android/android-web-apps-using-android-webview.html)以獲得對此的清晰解釋。 – ComDubh

回答

4

如果你有在頁面Ajax調用加載,onPageFinished()會被調用,只有當這些調用完成。 更好地使用window.setTimeout()進行這些調用。在這種情況下,UI線程不會在這些調用上被阻塞,onPageFinished()將在主頁加載後立即被調用。

+0

window.setTimeout()你能解釋一下如何做到這一點? –

0

有時會發生,當初始頁面加載時,某些腳本會進行重定向(因爲它需要會話ID,或者會使頁面再次加載的東西)。

您可以通過記錄url參數來檢查是否正在加載不同的頁面(或帶有附加參數的頁面)。

我想如果一個新的加載請求是在第一頁加載完成之前完成的,那麼OnPageFinished方法將不會被第一頁調用。

6

檢查它是否已經用.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

這對我有用(謝謝!),但每個'onPageStarted'調用在'PageFinished'調用上似乎都沒有對應,這似乎仍然很奇怪。 – ComDubh

0

這是一個解決方案。我不使用加載對話框,而是使用另一個webview作爲啓動畫面,但您可以輕鬆更改它。

訣竅是,看看在「onpagefinished」之後是否有新的「onpagestart」。如果是這種情況,請不要關閉裝載並等待下一個「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

當一個頁面提交的WebView應用: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(); 
     } 
    }