开发者

onPostExecute not called after completion AsyncTask

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 start the task with execute() method? The onPostExecute wouldn't run if you just invoke the doInBackground.


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.


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜