完成AsyncTask后未调用onPostExecute

时间:2010-08-31 06:23:08

标签: java android android-asynctask

出于某种原因,在onPostExecute()完成后我的AsyncTask未被调用。

我的课程声明:

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

我的onPostExecute():

protected void onPostExecute(Boolean result)

一切正常,我的doInBackground()成功完成并返回一个布尔值,但它刚刚结束。

由于

7 个答案:

答案 0 :(得分:51)

您是否使用execute()方法启动了该任务?如果您只是调用onPostExecute,则doInBackground将无法运行。

答案 1 :(得分:48)

您是否在UI线程上创建了AsyncTask?还要在onPostExecute()方法上添加@Override注释,以确保正确声明它。

答案 2 :(得分:30)

发现/犯了另一个令人讨厌的错误:

如果您onPostExecute(Param param)的参数与您使用extends AsyncTask<...,...,Param>定义的参数不匹配,并且您没有使用@Override注释,则永远不会执行你没有得到Eclipse的警告。

自己注意: 只需始终使用@Override注释,Eclipse将为您提供帮助。

避免所有指定错误的另一种简单方法:

Eclipse中的

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

答案 3 :(得分:2)

我也遇到了同样的问题。以上解决方案均不适合我。然后我发现了这个问题,也许对其他人有帮助。

在UI线程中,我调用以下代码:

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

        new SaveDrawingAsync(this).execute();

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

        ...
    }
}

我的AsyncTask类定义:

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;
    }

}
上面代码中的

未被调用。这是因为执行asynctask后出现无限循环。 asynctask和无限循环都互相等待完成。因此,代码卡住了!

解决方案正在改变设计!

答案 4 :(得分:1)

我有相同的行为,原因是我在doInBackground内部发布了很多消息,其中包含以下代码:

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

这必须重载主thrad消息队列,并在调用onPostExecute之前导致长时间延迟。解决方案是每秒只发布一次。

答案 5 :(得分:1)

犯了另一个令人讨厌的错误,可能导致同样的错误。在定义AsyncTask并调用它时,我没有调用execute但是正在调用doInBackground

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

而不是

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

答案 6 :(得分:0)

对我来说这是用户错误。我通过在它上面调用cancel(true)来结束AsyncTask,而不是仔细阅读文档,知道在这种情况下没有调用onPostExecute,onCancelled是。