我正在尝试执行以下AsyncTask:
private class TimeUpdateTask extends AsyncTask<List<mObject>, Integer, Void> {
@Override
protected Void doInBackground(List<mObject>... params) {
mObject o;
int i;
int numChecked = 0;
List<mObject> mObjects = params[0];
while(true)
{
if (isCancelled())
{
Log.w("TAG", "task interrumped");
return null;
}
for (i=0 ; i < mObjects.size() ; i++)
{
o = mObjects.get(i);
if (!o.isChecked())
{
o.calculateProgress();
if (o.isChecked())
{
numChecked++;
}
}
}
publishProgress(numChecked);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
@SuppressWarnings("unchecked")
@Override
protected void onProgressUpdate(Integer... param){
int progressCompleted = param[0];
((ArrayAdapter<mObject>) EventListView.this.EventView.getAdapter()).notifyDataSetChanged();
mMain.setProgressBarCompleted(progressCompleted);
}
/*This should execute*/
@Override
protected void onPostExecute(Void result) {
Log.d("TAG","End onPostExecute");
}
}
因此,当我在此任务上调用cancel(false)
时,onPostExecute
应该被执行,但它永远不会被执行。
代码或其他什么问题?
我已经在SO中查看了很多答案,看起来#5 AsyncTask
闲置是正常的,即使你现在只使用一个(如我的情况)。
答案 0 :(得分:10)
这里缺少一件你必须了解的大片。
来自开发者文档(请参阅下面的粗体文字):http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean)
尝试取消执行此任务。如果这种尝试失败了 任务已经完成,已经取消,或者不能 由于其他原因被取消。如果成功,这个任务就有了 调用cancel时未启动,此任务永远不会运行。如果 任务已经启动,然后是mayInterruptIfRunning参数 确定执行此任务的线程是否应该是 因试图停止任务而中断。
调用此方法将导致调用onCancelled(Object) 在doInBackground(Object [])返回后的UI线程上。的调用 此方法保证永远不会调用onPostExecute(Object)。 调用此方法后,应检查返回的值 isCancelled()定期从doInBackground(Object [])来完成 尽早完成任务。
答案 1 :(得分:3)
Android在取消任务时使用onCancelled(),它不会调用onPostExecute!
答案 2 :(得分:2)
我认为调用cancel实际上会取消执行所有内容,包括onPostExecute。您应该使用自己的本地布尔变量并执行此操作:
private boolean shouldContinue = true;
public void customCancel()
{
shouldContinue = false;
}
然后在你的循环中执行此操作:
if (!shouldContinue)
{
Log.w("TAG", "task interrumped");
return null;
}