次のようなコードがあります。ダイアログをキャンセルするたびにInterruptExceptionが発生し、cancel
メソッドは実際には機能しません。下に示すように、onPostExecute
メソッドでcancel
の状態を出力しますが、これは真ではなく偽です。 isRunning
パラメータを追加する前に、明らかにスレッドはバックグラウンドで実行されていました。 isRunning
はスレッドを停止しますが(onPostExecute
メソッドが実行されました)、例外が発生した理由と、まだメソッドの中にまだfalse
が残っている理由を知りたいと思います。ありがとう!スレッドが停止しているかどうか、AsyncTaskを使用してAndroidのprogressDialogにある問題
public void startDownload(View view){
dialog = new ProgressDialog(this);
final Downloader downloader = new Downloader(this, dialog);
downloader.execute(0);
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
downloader.cancel(true);
}
});
}
public class Downloader extends AsyncTask<Integer, Integer, String> {
private Context context;
private PowerManager.WakeLock wakeLock;
private ProgressDialog dialog;
public boolean isRunning = true;
public Downloader(Context context, ProgressDialog dialog) {
this.context = context;
this.dialog = dialog;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
getClass().getName());
wakeLock.acquire();
dialog.setMessage("Downloading...");
dialog.setIndeterminate(true);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setCancelable(false);
dialog.setButton(ProgressDialog.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
isRunning = false;
}
});
dialog.show();
}
@Override
protected String doInBackground(Integer[] params) {
int count = params[0];
while(count<100 && isRunning){
publishProgress(count);
try{
count++;
System.out.println(count);
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
dialog.setIndeterminate(false);
dialog.setMax(100);
dialog.setProgress(values[0]);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
wakeLock.release();
dialog.dismiss();
if (s != null)
Toast.makeText(context,"Download error: "+ s, Toast.LENGTH_LONG).show();
else
Toast.makeText(context,"File downloaded", Toast.LENGTH_SHORT).show();
System.out.println(isCancelled());
}
}
'Thread.sleep(200);'を削除してやり直すことはできますか? –