Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

onPostExecute on cancelled AsyncTask

Does onPostExecute execute if the AsyncTask has been cancelled?

If it does execute, is it safe to say that I should always ask if the task has been cancelled (isCancelled) at the start of onPostExecute, before doing anything else?

like image 218
hpique Avatar asked Jul 26 '10 12:07

hpique


People also ask

What happens to AsyncTask if activity is destroyed?

If you start an AsyncTask inside an Activity and you rotate the device, the Activity will be destroyed and a new instance will be created. But the AsyncTask will not die. It will go on living until it completes.

What method must be overridden for using AsyncTask?

Usage. AsyncTask must be subclassed to be used. The subclass will override at least one method ( doInBackground(Params...) ), and most often will override a second one ( onPostExecute(Result) .)

How do you know when AsyncTask is done?

Use getStatus() to get the status of your AsyncTask . If status is AsyncTask. Status. RUNNING then your task is running.

What is the problem with AsyncTask in Android?

In summary, the three most common issues with AsyncTask are: Memory leaks. Cancellation of background work. Computational cost.


3 Answers

The documented behaviour of onPostExecute on cancel() was changed between Android 2 and Android 4.

Android 2.3.7 onPostExecute :

Runs on the UI thread after doInBackground. The specified result is the value returned by doInBackground or null if the task was cancelled or an exception occured.

Android 4.0.1 onPostExecute :

Runs on the UI thread after doInBackground. The specified result is the value returned by doInBackground. This method won't be invoked if the task was cancelled.

So if you are still targeting Android 2 devices you should assume that onPostExecute will be called and in onPostExecute check for null result.

like image 184
bain Avatar answered Oct 28 '22 19:10

bain


From my experience the onPostExecute() is actually not invoked when the task is cancelled. However, it may be possible to cancel the task after the task's doInBackground() is finished but before the onPostExecute() is invoked - in this case the onPostExecute() is actually invoked. Therefore, to be sure, I call the isCancelled() method in onPostExecute() and just "return" if the task has been cancelled. It works for me.

like image 37
Martin Vysny Avatar answered Oct 28 '22 19:10

Martin Vysny


After checking the AsyncTask source code it seems that onPostExecute is invoked even if the task is cancelled. However, before calling onPostExecute the result is set to null (?) if the task has been cancelled.

Edit: @bain provides an updated answer.

like image 7
hpique Avatar answered Oct 28 '22 19:10

hpique