Reputation: 31
I would like to cancel an Asynctask
in android but I have a problem with my implementation :
My code is :
private class SynchroTask extends AsyncTask{ private volatile boolean running = true;
@Override
protected void onPreExecute() {
super.onPreExecute();
//INITIALIZATIONS
}
@Override
protected Void doInBackground(Void... params) {
while (running) {
//TASK
}
return null;
}
@Override
protected void onCancelled(){
super.onCancelled();
running = false;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Intent intent = AccountAddActivity.getIntent(getActivity());
startActivity(intent);
getActivity().finish();
}
}
}
And :
mSynchroTask = new SynchroTask();
cancelButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if (mSynchroTask != null && mSynchroTask.getStatus() != AsyncTask.Status.FINISHED){
HDCApplication.hdcAppManager.mSynchroManager.removeAllTask();
mSynchroTask.cancel(true);
mSynchroTask = null;
}
}
});
Upvotes: 0
Views: 874
Reputation: 2846
That's half of implementation of what you have done
mSynchroTask.cancel(true);
A task can be cancelled at any time by invoking cancel(boolean). Invoking this method will cause subsequent calls to isCancelled() to return true. After invoking this method, onCancelled(Object), instead of onPostExecute(Object) will be invoked after doInBackground(Object[]) returns.
This is what you are missing
To ensure that a task is cancelled as quickly as possible, you should always check the return value of isCancelled() periodically from doInBackground(Object[]), if possible (inside a loop for instance.)
Source : http://developer.android.com/reference/android/os/AsyncTask.html
Upvotes: 2
Reputation:
if (mSynchroTask != null && mSynchroTask.getStatus() != AsyncTask.Status.FINISHED){
mSynchroTask.cancel(true);
mSynchroTask = null;
HDCApplication.hdcAppManager.mSynchroManager.removeAllTask();
}
Upvotes: 0