点击后执行 AsyncTask :
List<RSSItem> list = new Vector<RSSItem>();
private OnClickListener click = new OnClickListener() {
public void onClick(View view) {
list.clear();
if((dft.getStatus().toString()).equals("RUNNING")) dft.cancel(true);
currentCategory = catigoriesHolder.indexOfChild(view);
dft = new DownloadFilesTask();
dft.execute(rssFeedURL[currentCategory]);
}
};
在 doInBackGround 方法中,填充变量 列表 。如何防止在用于填充 ListView 的位置清除列表。如何确定,在下一次单击 AsyncTask 的上一个实例时,它已被销毁,并且没有进一步处理它。
问题在于版本1.6。
答案 0 :(得分:3)
首先,异步任务通常不会在同一时刻运行,但同一异步任务的执行实际上是一个队列。所以想象一下,如果你创建了2个DownloadFilesTask的实例,用相同的方法执行它们,如:
task1.execute();
task2.execute();
这意味着任务2将不会运行,直到task1完成整个onPreExecute,DoInBg,onPostExecute进程,因此您可以确定这不会同时发生。 taskStatus也是一个ENUM。你可以检查它,而不是像这样的字符串:
task.getStatus()==Status.FINISHED
在你的情况下,如果你不想排队多个任务,直到当前正在运行的任务完成,那么做这样的事情:
if(task==null || task.getStatus()!=Status.FINISHED){
task = new DownloadFilesTask();
task.execute();
}
取消任务意味着doInBackground将运行,但postExecute将不会运行。您可以检查任务是否正在运行,以便在bg处理过程中取消它。
答案 1 :(得分:2)
您可以在成员变量中存储对AsyncTask
的引用。所以你的代码看起来像这样:
List<RSSItem> list = new Vector<RSSItem>();
DownloadFilesTask downloadTask = null;
private OnClickListener click = new OnClickListener() {
public void onClick(View view) {
list.clear();
if((dft.getStatus().toString()).equals("RUNNING")) dft.cancel(true);
currentCategory = catigoriesHolder.indexOfChild(view);
if(downloadTask == null){
downloadTask = new DownloadFilesTask();
downloadTask.execute(rssFeedURL[currentCategory]);
} else {
//show warning here
}
}
}
当然,您需要在downloadTask
中将null
设置为onPostExecute()
才能生效。
作为额外的好处,如果活动被销毁,您现在可以取消未完成的任务:
@Override
onDestroy() {
if(downloadTask != null) {
downloadTask.cancel();
}
}
无论如何你应该做什么。