我在Android应用程序中使用AsyncTask
。
这是我的任务:
public class MyTask extends AsyncTask<String, String, Boolean> {
private ProgressDialog progressDialog;
private boolean isCancelled = false;
public MyTask(ProgressDialog progressDialog) {
this.progressDialog = progressDialog;
}
@Override
protected Boolean doInBackground(String... params) {
try {
if (!isCancelled()) {
isCancelled = false;
} else
isCancelled = true;
} catch (Exception e) {
isCancelled = true;
}
return isCancelled;
}
@Override
protected void onCancelled() {
super.onCancelled();
isCancelled = true;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
progressDialog.dismiss();
if (!isCancelled) {
// start an activity
}
}
}
我想在按设备的后退按钮时取消此任务并取消ProgressDialog
,但此任务会快速执行。按下后退按钮时,ProgressDialog
被取消,但任务完成。
从这样的活动调用此AsyncTask
:
ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Loading");
progressDialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
if (myTask!= null
&& myTask.getStatus() != AsyncTask.Status.FINISHED
&& !myTask.isCancelled()) {
myTask.cancel(true);
}
}
});
progressDialog.show();
myTask = new MyTask(progressDialog);
myTask.execute();
记录时,我发现在执行onDismissListener
条件后,对话框被解除(调用onPostExecute()
)。如何正确取消此任务?
我的意图是用后退按钮取消任务,无论任务是否完成。是否可以从onPostExecute()
?
答案 0 :(得分:1)
实际上,您的代码看起来不对,
In ProgressDialog的OnCancel()
在调用myTask.cancel(true);
方法onCancelled(Object)
之后,而不是
onPostExecute(Object
之后将调用doInBackground(Object[])
}。
注意:强>
If you call cancel(true), an interrupt will be sent to the background thread,
which may help interruptible tasks. Otherwise, you should simply make sure to check
isCancelled() regularly in your doInBackground() method.
您可以在http://code.google.com/p/shelves找到相关示例。
但是我建议你不要取消AsyncTask,只是保持你的布尔标志只关闭后退按下的对话框,并且onPostExecute()
AsyncTask决定如何使用你的布尔标志条件对结果做什么。