【发布时间】:2011-11-22 11:32:20
【问题描述】:
我正在尝试执行以下 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 闲逛是正常的,即使您目前只使用一个(如我的情况)。
【问题讨论】:
-
进一步了解其他 cmets / 答案 - 不要使用
while(true)。试试while(!isCancelled())- 更有意义。 -
谢谢,我也是这么想的:)