并行执行AsyncTask

时间:2011-08-10 12:14:34

标签: android parallel-processing android-asynctask

点击后执行 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。

2 个答案:

答案 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();
     }
 }

无论如何你应该做什么。