Как отменить AsyncTask, а затем создать новый с помощью одного клика? - PullRequest
0 голосов
/ 21 июля 2011

У меня есть пользовательский класс DownloadFiles , который расширяется AsyncTask .Приложение запускается само по себе и запускает AsyncTask в фоновом режиме для URL-адреса по умолчанию.На интерфейсе у меня есть несколько кнопок - каждая из них onClick событие должно отменить текущий DownloadFiles экземпляр и создать новыйс другим URL.

private OnClickListener categoryClick = new OnClickListener(){
        public void onClick(View view) {
            dft.cancel(true);
            int index = catigoriesHolder.indexOfChild(view);
            activeCategory.setText(categories[index]);
            dft = new DownloadFilesTask();
            dft.execute(rssFeedURL[index]);
            dft.execute(url);
        }
    };

dft - мой DownloadFiles объект, который мне нужно отменить.И вот мой onCancelled метод:

protected void onCancelled() {
            super.onCancelled();
        }

Я также пытался проверить внутри события click, если dft отменен изатем создать новый экземпляр моего пользовательского загружаемого класса.Как это можно сделать и почему, когда я пытаюсь это сделать:

private OnClickListener categoryClick = new OnClickListener(){
        public void onClick(View view) {
            if (dft.isCancelled()) {
                int index = catigoriesHolder.indexOfChild(view);
                activeCategory.setText(categories[index]);
                dft = new DownloadFilesTask();
                dft.execute(rssFeedURL[index]);
            } else {
                dft.cancel(true);
            }
        }
    };

не работает, даже при втором щелчке?

Я попробовал это после того, как вы посоветовали мне проверить isCancelled () внутри doInBackground (...)

private OnClickListener categoryClick = new OnClickListener(){
        public void onClick(View view) {
            int index = catigoriesHolder.indexOfChild(view);
            activeCategory.setText(categories[index]);
            if (dft.isCancelled()) {
                dft.cancel(false);
                dft = new DownloadFilesTask();
                dft.execute(rssFeedURL[index]);
            } else {
                dft.cancel(true);
            }
        }
    };

Но что происходит, в этом случае:- URL по умолчанию работает нормально, но когда я нажимаю на кнопку, никаких действий не происходит.

protected List<RSSItem> doInBackground(String... urls) {
            parse(urls[0]);

            if (feed == null) { return null; }

            rssList = feed.getAllItems();
            Iterator<RSSItem> iterator = rssList.iterator();

            while(iterator.hasNext()) {
                if (isCancelled()) return null; 
                RSSItem rss = iterator.next();
                publishProgress(rss);
            }

            return rssList;
        }

После того, как я проверил состояние текущего AsyncTask , это работает:

private OnClickListener categoryClick = new OnClickListener(){
        public void onClick(View view) {
            String status = dft.getStatus().name();
            if (status.equals("FINISHED") || dft.isCancelled()) {
                dft = new DownloadFilesTask();
                int index = catigoriesHolder.indexOfChild(view);
                activeCategory.setText(categories[index]);
                dft.execute(rssFeedURL[index]);
            } else {
                dft.cancel(true);
            }
        }
    };

Но все еще не соответствует моим ожиданиям.В настоящее время вам нужно дважды щелкнуть, чтобы получить новый экземпляр класса DownloadFiles .Можно ли превратить его в один клик?

1 Ответ

3 голосов
/ 21 июля 2011

Метод .cancel (true) изменяет только внутреннюю отмененную переменную в задаче. Вы должны периодически вызывать isCancelled () внутри doInBackground () и возвращать его, когда оно оценивается как true.

Также, пожалуйста, укажите, что не работает в каждом случае.

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