How to cancel an AsyncTask and then to instantiate a new one with a single click?
I have a custom DownloadFiles class which extends AsyncTask. The app launches itself and starts an AsyncTask in background for a default URL. On the UI, I have a number of buttons - each of them onClick event should cancel the current DownloadFiles instance and create new one with a different 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 is my DownloadFiles object, witch I need to cancel. And here is my onCancelled method:
protected void onCancelled() {
super.onCancelled();
}
I tried also to check inside the click-event if the dft is cancelled and then to create a new instance of my custom downloadable class. How could be this done and why when I trying this:
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);
}
}
};
it does not work, even on the second click?
I tried this after you advised me to check for isCancelled() inside the 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);
}
}
};
But what happens, in this case: - the default URL works fine, but when I click on a button, there is no action.
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;
}
After I checked the status of the current AsyncTask, it works:
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);
}
}
};
But still doesn't fit my expectations. Currently you should click twice to get new instance of DownloadFiles class. Could to transform it to a single click?
The .cancel(true) method only changes the internal canceled variable in the task. You have to call isCancelled() inside doInBackground() periodically and return when it evaluates true.
Also, please specify what is not working in each case.
精彩评论