38

出于某种原因onPostExecute(),我完成后没有调用 my AsyncTask

我的班级声明:

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

我的 onPostExecute():

protected void onPostExecute(Boolean result)

一切正常,我doInBackground()成功完成并返回一个布尔值,但它就完成了。

谢谢

4

8 回答 8

56

您是否使用方法开始任务execute()?如果onPostExecute您只调用doInBackground.

于 2010-08-31T07:35:34.700 回答
48

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

于 2010-08-31T06:35:21.093 回答
30

发现/犯了另一个严重的错误:

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

请注意:始终使用@Override注释,Eclipse 会帮助您。

避免所有命名错误的另一种简单方法:

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

于 2012-06-20T20:50:46.923 回答
5

在遇到同样的问题并且这些答案都没有帮助我之后,我发现我的 UI 线程被阻止(我使用了 a CountDownLatch.await()),因此onPostExecute()从未调用过应该由 UI 线程调用的方法。

于 2015-11-24T01:36:52.313 回答
3

犯了另一个严重的错误,可能导致同样的错误。定义 AsyncTask 并调用它时,我不是在调用execute而是在调用doInBackground

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

而不是

new AsyncTask<String,Void,Void>() {
    ....
}.execute("parameter");
于 2017-08-02T00:39:14.603 回答
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;
    }

}

在上面的代码中 onPostExecute 没有被调用。这是因为 asynctask 执行后的无限循环。asynctask 和无限循环都在等待对方完成。因此代码卡住了!

解决方案是改变设计!

于 2018-07-05T09:04:48.890 回答
1

我有同样的行为,原因是我在 doInBackground 中使用以下代码发布了很多消息作为进度:

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

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

于 2016-01-23T02:16:52.373 回答
0

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

于 2018-04-26T00:12:58.500 回答