문제

For some reason my onPostExecute() is not called after my AsyncTask finishes.

My class decleration:

public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean>

My onPostExecute():

protected void onPostExecute(Boolean result)

Everything works fine, my doInBackground() completes successfully and returns a Boolean but then it just finishes.

Thanks

도움이 되었습니까?

해결책

Did you create your AsyncTask on the UI thread? Also add an @Override annotaiton on your onPostExecute() method to make sure you declared it correctly.

다른 팁

Did you start the task with execute() method? The onPostExecute wouldn't run if you just invoke the doInBackground.

Found/Made another nasty mistake:

If your params of onPostExecute(Param param) don't match the one you defined with extends AsyncTask<...,...,Param> and you didn't use the @Override annotation, it will never be executed and you don't get a warning from Eclipse.

Note to myself: Just always use the @Override annotation and Eclipse will help you.

Another easy way to avoid all named mistakes:

in Eclipse: Right-click in code > Source > Override/Implement Methods

After having the same problem and none of these answers helped me, I found out that my UI thread was blocked (I used a CountDownLatch.await()) and therefore the onPostExecute() method that is supposed to be called by the UI thread was never called.

Made another nasty mistake that can result in this same error. When defining the AsyncTask and calling it, I was not calling execute but was calling doInBackground

new AsyncTask<String,Void,Void>() {
    ....
}.doInBackground("parameter");

rather than

new AsyncTask<String,Void,Void>() {
    ....
}.execute("parameter");

I have faced the same problem. None of the above solutions worked for me. Then i figured out the problem maybe it helps someone else .

In UI thread i call the following codes:

public class XActivity ...{
    onCreate(){
        ....

        new SaveDrawingAsync(this).execute();

        while(true)
        {
            if(MandalaActivity.saveOperationInProgress){
                continue;
            }
            super.onBackPressed();
            break;
        }

        ...
    }
}

My AsyncTask class definition :

public class SaveAsync extends AsyncTask<Object, Void, Void> {

    @Override
    public Void doInBackground(Object... params) {
        saveThem(); // long running operation
        return null;
    }

    @Override
    public void onPostExecute(Void param) {
        XActivity.saveOperationInProgress = false;
    }

    @Override
    public void onPreExecute() {
       XActivity.saveOperationInProgress = true;
    }

}

in the above code onPostExecute is not called. It is because of an infinite loop after asynctask execution . asynctask and inifinite loop both waits eachother to finish. Thus the code stucks!

The solution is changing the design!

I had the same behaviour, and the cause was that I have been posting a lot of messages as a progress inside doInBackground with following code:

new Handler(Looper.getMainLooper()).post(new Runnable() {
   @Override
   public void run() {
     // .. some UI updates
   }
});

this must have overloaded main thrad message queue, and caused long delay before onPostExecute would get called. The solution was to post only once every second.

For me it was user error. I was ending the AsyncTask by invoking cancel(true) on it and not reading the documentation closely enough to know that onPostExecute is not called in this case, onCancelled is.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top