如何取消AsyncTask,然后通过单击实例化一个新的?

时间:2011-07-21 19:18:27

标签: android button new-operator android-asynctask

我有一个自定义的 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();
        }

如果 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);
            }
        }
    };

即使在第二次点击时它也不起作用?

在您建议我在 doInBackground(...) 中检查 isCancelled() 后,我试过这个强>

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 个答案:

答案 0 :(得分:3)

.cancel(true)方法仅更改任务中的内部取消变量。你必须定期在doInBackground()内调用isCancelled(),并在它计算为true时返回。

另外,请说明每种情况下不起作用的内容。