Android: WebViewClientでonPageFinishedは複数回呼ばれる可能性あり

表題の通りなんだけれども。

最初全然気付かなかったんだけど、Ajax使ってるサイトとかで起きた。

WebViewClientを継承してロード中…みたいなProgressDialogを出そうと思ってやってみたら出来てたわけです。
しかし、YouTubeのサイトで画面タップしたら、いきなりエラーで落ちた。LogCat見たら、「onPageFinishedでpd.dismiss()ってやってるけど、ProgressDialogないよ!」って怒られてた。
ん?なんで一度onPageFinished終わってるのに再度呼ばれてるの?と疑問に思ったのだが、どうもAjaxでデータ取り終わった後にも呼ばれているっぽい。onPageStartedはAjax呼ばれた最初にはコールされないので、pdを初期化する処理が行われずに呼ばれるからエラーと。そうですか…。

ということで、以下のように改良。

public class HogeActivity extends Activity {
	.
	.
	.
	/**
	 * WebViewのロード中にプログレスダイアログを表示するクラス
	 * 
	 */
	public class SimpleLoadingClient extends WebViewClient {
		
		private ProgressDialog pd;
		@Override
		public void onPageFinished(WebView view, String url) {
			super.onPageFinished(view, url);
			this.dismissDialog();
		}
		
		private void dismissDialog() {
			if (pd != null) {
				pd.dismiss();
				pd = null;
			}
		}
		
		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {
			super.onPageStarted(view, url, favicon);
			this.dismissDialog();
			pd = new ProgressDialog(HogeActivity.this);
			pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
			pd.setMessage(getString(R.string.now_loading));
			pd.show();
		}
	}
}

pdがnullならdismissしないようにすると。
以上でーす。


カテゴリー Android | タグ    | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です