Android 処理待ちダイアログの設定(ProgressDialog)

Android 処理待ちダイアログの設定(ProgressDialog)

らぼろぐ

やまま

Androidでの開発で、時間がかかる処理を行っている時に処理中であることや進捗状態を示す為にProgressDialogを使用する。
今回はシンプルなくるくる回るタイプのダイアログの設定を説明します。

処理中ダイアログ

Handlerを作ったスレッドで実行を可能にする為、Runnableインターフェイスを実装する。
クラス変数にプログレスダイアログとスレッドを宣言する。

public class XXXX extends Activity implements Runnable {
private static ProgressDialog waitDialog;
private Thread thread;

任意の処理時にプログレスダイアログの設定・表示を行い、スレッドを実行する。

private void AAA(){
// プログレスダイアログを開く処理を呼び出す。
setWait();
}

private void setWait(){
// プログレスダイアログの設定
waitDialog = new ProgressDialog(this);
// プログレスダイアログのメッセージを設定します
waitDialog.setMessage("ネットワーク接続中...");
// 円スタイル(くるくる回るタイプ)に設定します
waitDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
// プログレスダイアログを表示
waitDialog.show();

thread = new Thread(this);
/* show()メソッドでプログレスダイアログを表示しつつ、
* 別スレッドを使い、裏で重い処理を行う。
*/
thread.start();
}

@Override
public void run() {
try {
//ダイアログがしっかり見えるように少しだけスリープ
//(nnn:任意のスリープ時間・ミリ秒単位)
Thread.sleep(nnn);
} catch (InterruptedException e) {
//スレッドの割り込み処理を行った場合に発生、catchの実装は割愛
}
//run内でUIの操作をしてしまうと、例外が発生する為、
//Handlerにバトンタッチ
handler.sendEmptyMessage(0);
}

private Handler handler = new Handler() {
public void handleMessage(Message msg){
// HandlerクラスではActivityを継承してないため
// 別の親クラスのメソッドにて処理を行うようにした。
YYY();

// プログレスダイアログ終了
waitDialog.dismiss();
waitDialog = null;
}
};

private void YYY(){
// 処理待ち中に行う処理をここに実装
}

WebViewでの設定
WebView内でページを遷移させる場合、
読込中にプログレスダイアログを表示させる場合はWebViewに対してWebViewClientを継承し、
onPageStarted()とonPageFinished()にてダイアログの表示切替を行う。

WebView web = (WebView)findViewById(R.id.webPage);

// APP内でweb画面遷移
web.setWebViewClient(new WebViewClientLinkSet());

WebViewClient継承クラスの設定

private class WebViewClientLinkSet extends WebViewClient {

// 読み込み開始時に呼び出されるメソッドをオーバーライドし、
// そのなかでプログレスダイアログを画面上に表示を行う。
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);

waitDialog = new ProgressDialog(view.getContext());
waitDialog.setMessage("ネットワーク接続中...");
waitDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
waitDialog.show();
}

// 読み込み終了時に呼び出されるメソッドをオーバーライドし、
// そのなかでプログレスダイアログの消去を行う。
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);

// ページ読み込み終了メソッドが複数回呼ばれることがあるため
// 存在チェックを行う
if(waitDialog != null){
waitDialog.dismiss();
waitDialog = null;
}
}

// 読み込み失敗時に呼び出されるメソッドをオーバーライドし、
// エラーダイアログを画面に表示させる。
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
AlertDialog.Builder dialog = new AlertDialog.Builder(view.getContext());

dialog.setTitle("エラータイトル");
dialog.setMessage("エラーメッセージ");

dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

}
});

if(waitDialog != null){
waitDialog.dismiss();
waitDialog = null;
}

dialog.setCancelable(false).create().show();
}
}

参考文献
ProgressDialogの使い方メモ
プログレスダイアログ(ProgressDialog)を使用するには
AndroidのHandlerとは何か?
Webブラウザ(WebView)を利用する(2)

この記事はいかがでしたか?

writer
やまま
やまま

エンジニア

マンガとアニメとゲームから錬成された宇宙大好きエンジニア。 軌道エレベーターで行ける静止軌道上のコロニーに住まいを移し、ゲームやってマンガ読んでアニメ見て爆睡、ゲームやってマンガ読んでアニメ見て爆睡、という生活を夢見ながら今日もコードを書き続けるのだった。

関連記事

ページトップへ