#blog2navi()
*AlertDialogでOKが押されたらプログレスダイアログを出して処理をする [#g67a43e3]
普通、ダイアログの処理はこんなふうに書きますよね。
#code(java){{
AlertDialog ddg = new AlertDialog.Builder(context)
.setTitle("タイトル")
.setMessage("メッセージ")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
// 処理
doImport();
}
})
.setNegativeButton(R.string.cancel, null)
.create();
ddg.show();
}}
~
でも、この「処理」が長いので、プログレスダイアログを出したいとします。~
で、onClickの部分をこんな風に書いてみますが、これではうまくいきません。
#code(java){{
@Override
public void onClick(DialogInterface dialog, int whichButton) {
ProgressDialog progressDialog;
progressDialog = new ProgressDialog(context);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setMessage("処理中....");
progressDialog.setCancelable(true);
progressDialog.show();
// 処理
doImport();
progressDialog.dismiss();
}
}}
~
実際には、以下のような流れになってしまいます。
+ AlertDialogのOKを押下
+ 処理が実行
+ AlertDialogが消える
どうやら、AlertDialogが表示されているためにプログレスダイアログが表示されないようです。~
また、onClick(){}の処理が完了しないとAlertDialogが閉じてくれません。(onClickの中でddg.dismiss()とかやってもダメです)~
~
これを解決するためには、onClick()の処理は速やかに完了した上で、別にdoImport()を実行する必要があります。~
つまり、別スレッドにします。~
コードにするとこんな感じです。
#code(java){{
AlertDialog ddg = new AlertDialog.Builder(context)
.setTitle("タイトル")
.setMessage("メッセージ")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
// 処理
(new Thread( new Runnable() {
@Override
public void run() {
doImport();
}
})).start();
}
})
.setNegativeButton(R.string.cancel, null)
.create();
ddg.show();
}}
~
処理側はこんな風に書きます。~
ただし、プログレスダイアログはUIスレッドに依頼する必要がありますので、Handlerを使用します。
#code(java){{
private void doImport() {
// プログレス表示
displayProgressDialog();
// 処理
:
// プログレス消去
dismissProgressDialog();
}
private void dismissProgresDialog() {
// handlerを作ったスレッドへRunnable()をpostする
handler.post(new Runnable() {
@Override
public void run() {
if( null != progressDialog && progressDialog.isShowing() ){
progressDialog.dismiss();
}
}
});
}
private void displayProgressDialog() {
// handlerを作ったスレッドへRunnable()をpostする
handler.post(new Runnable() {
@Override
public void run() {
progressDialog = new ProgressDialog(context);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setMessage(context.getResources().getString(R.string.importing));
progressDialog.setCancelable(true);
progressDialog.show();
}
});
}
}}
~
handlerは、事前にUIスレッドでnewしておく必要があります。~
onCreate()内で良いでしょう。~
何故 displayProgressDialog() などの中でnewしてはいけないかは、[[ここ:http://d.hatena.ne.jp/sankumee/20120329/1333021847]]を読むと大変よくわかります。
----
#htmlinsert(20131101_progress.html)
RIGHT:Category: [[[android>日記/Category/android]]] - 22:28:02
----
RIGHT:&blog2trackback();
&new{2014-03-14 (金) 06:04:24};
#blog2navi()