我有一个自定义的 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 类的新实例。可以将其转换为单击吗?
答案 0 :(得分:3)
.cancel(true)方法仅更改任务中的内部取消变量。你必须定期在doInBackground()内调用isCancelled(),并在它计算为true时返回。
另外,请说明每种情况下不起作用的内容。