2011-10-06 33 views
9

私の質問はthisと異なります。 ページロードが開始されると私の進行状況ダイアログが表示されません。私の問題は進捗ダイアログが開始され、決して解雇されないことです。私は進捗ダイアログが開始し、何度も却下され、ページロードが完了した後でも開始され、解雇されないことを示すブレークポイントを設定しました。私の質問は、なぜ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! 

はそれが正常に動作します。あなたがロードされているページでAJAX呼び出しを持っている場合)(onPageFinished、

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をロードしない 'のためのより正確だと思うと、下のようにコードをたどる解雇onPageStartedが、発生しませんonPageFinished単に 'false'を返します。これの明確な説明については、[このチュートリアルのJakob Jenkov](http://tutorials.jenkov.com/android/android-web-apps-using-android-webview.html)を参照してください。 – ComDubh

答えて

4

これらの呼び出しが終了した場合にのみ呼び出されます。ここでは ログがあります。 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のアプリに提出:固定と正確

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(); 
     } 
    } 
関連する問題