параллельное выполнение AsyncTask - PullRequest
0 голосов
/ 10 августа 2011

An 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]);
    }
};

In doInBackGround метод Переменная список заполняется. Как предотвратить очистку списка в точке, в которой он используется для заполнения ListView . Как быть уверенным, что при следующем щелчке предыдущий экземпляр AsyncTask был уничтожен и его дальнейшая обработка не производится.

Проблема касается версии 1.6.

Ответы [ 2 ]

3 голосов
/ 10 августа 2011

Прежде всего асинхронные задачи в общем случае не запускаются в один и тот же момент, но выполнение одной и той же асинхронной задачи фактически является очередью. так что представьте, если вы создаете 2 экземпляра вашей DownloadFilesTask и выполняетеих таким же способом, как:

task1.execute();
task2.execute();

, это означает, что задача 2 не будет запущена, пока задача 1 не завершит весь процесс onPreExecute, DoInBg, onPostExecute, так что вы можете быть уверены, что этого не произойдет одновременно.также taskStatus является ENUM.вы можете проверить это так, а не в виде строки, такой как:

task.getStatus()==Status.FINISHED

в вашем случае, если вы не хотите ставить в очередь несколько задач до тех пор, пока текущая задача не будет завершена, выполните что-то вроде этого:

if(task==null || task.getStatus()!=Status.FINISHED){
    task = new DownloadFilesTask();
    task.execute();
}

Отмена задачи означает, что doInBackground будет работать, но postExecute не будет.вы можете проверить, выполняется ли задание, чтобы отменить его во время обработки bg.

2 голосов
/ 10 августа 2011

Вы можете сохранить ссылку на 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();
     }
 }

Что вы должны сделать в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...