以下のコードに示すように、進行状況ダイアログを作成しようとしています。しかし、問題は、キャンセルを押してプログレス バー (編集:プログレス バーの表示ボタン) をもう一度クリックすると、期待どおりに動作しないことです。インジケーターの動きが速くなり、完了せずに終了することもあります。
これは、スクリーン ショットの [クリックして表示...] ボタンをクリックしたときに onClick3 を呼び出すコードです。
ProgressDialog progressDialogAdvanced;
public void onClick3(View v ){
showDialog(1);
progressDialogAdvanced.setProgress(0);
t = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1; i <=10; i++){
try{
Thread.sleep(500);
progressDialogAdvanced.incrementProgressBy((int)10);
}catch(InterruptedException e ){
e.printStackTrace();
}
}
progressDialogAdvanced.dismiss();
}
});
t.start();
}
プログレスバーを作成するコードは次のとおりです。
protected Dialog onCreateDialog(int id) {
switch (id) {
case 1:
progressDialogAdvanced = new ProgressDialog(this);
progressDialogAdvanced.setIcon(R.drawable.ic_launcher);
progressDialogAdvanced.setTitle("Downloading...");
progressDialogAdvanced.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialogAdvanced.setButton(DialogInterface.BUTTON_POSITIVE,"OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//To change body of implemented methods use File | Settings | File Templates.
//progressDialogAdvanced.setProgress(0);
Toast.makeText(getBaseContext(),"OkClicked",Toast.LENGTH_SHORT).show();
}
});
progressDialogAdvanced.setButton(DialogInterface.BUTTON_NEGATIVE,"Cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
progressDialogAdvanced.dismiss();
Toast.makeText(getBaseContext(),"Cancelled",Toast.LENGTH_SHORT).show();
}
});
return progressDialogAdvanced;
}
}
編集:
disconnect() の代わりに cancel() を使用しました。以下に示すようにハンドラーを使用しても、何も修正されません。スレッドが破棄されるまで待つ必要があります。
for(int i = 1; i <=10; i++){
try{
Thread.sleep(500);
}catch(InterruptedException e ){
e.printStackTrace();
}
progressBarHandler.post(new Runnable() {
public void run() {
progressDialogAdvanced.incrementProgressBy(10);
}
});
}
progressDialogAdvanced.cancel();