完成AsyncTask后未调用onPostExecute

38
出现问题:我的AsyncTask完成后,onPostExecute()没有被调用。

类定义如下: public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean> 我的onPostExecute()方法如下: protected void onPostExecute(Boolean result) 一切都运行正常,doInBackground()顺利完成并返回了一个Boolean值,但是它却直接结束了。
谢谢。
8个回答

56

你是否使用了execute()方法开始任务?如果只是调用doInBackground,那么onPostExecute不会运行。


@Konstantin 那么如何调用onPostExecute()函数? - Animesh Mangla
1
@developer 在 doInBackground 返回后,onPostExecute 会自动为您调用。除非在异步任务上调用了取消。 - Konstantin Burov
@KonstantinBurov 是的,现在它正在工作。谢谢 :) - Animesh Mangla

48

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


1
我那里没有@Override。看了这个例子(http://developer.android.com/reference/android/os/AsyncTask.html),他们也没有。为什么我必须在onPostExecute()上有一个,但其他的没有? - mlevit
1
似乎在模拟器上可以运行,但在手机上无法运行。当后台进程完成时,没有Toast通知出现。布局看起来因某种未知原因重新加载了。有什么想法吗? - mlevit
8
不一定需要使用 @Override,但这是确保你正确重写方法的一种方式。 - Romain Guy
1
我犯了一个错误,使用了"OnPostExecute"而不是'onPostExecute'。谢谢你的提示 :) - rogerstone
我已经在UI线程之外创建了Asynctask。感谢解决! - Radu
当我重写onPostExecute时,我遇到了一个错误... 有人知道为什么吗? - Darrell

31

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

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

自己注意: 始终使用 @Override 注释,Eclipse 将帮助你避免这个问题。

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

在 Eclipse 中:右键单击代码 > 源 > 重写/实现方法


2
我刚刚在这里解决了我的同事的问题 - 他使用了boolean而不是Boolean! - PayToPwn
哇,谢谢。在看到这篇文章之前,我不知道当我扩展AsyncTask时必须明确标记返回值的类型。我只是用了extends AsyncTask而没有类型。 - TKoL

5

在我遇到同样的问题并且这些答案都无法解决之后,我发现我的UI线程被阻塞了(我使用了CountDownLatch.await()),因此UI线程应该调用的onPostExecute()方法从未被调用。


3
做了另一个可能导致相同错误的错误。在定义AsyncTask并调用它时,我没有调用execute而是调用doInBackground。请注意区分二者。
new AsyncTask<String,Void,Void>() {
    ....
}.doInBackground("parameter");

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

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和无限循环都在等待对方完成。因此,代码陷入了僵局!
解决方法是改变设计!

1

我遇到了相同的问题,原因是我一直在使用以下代码在doInBackground内作为进度发布消息:

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

这可能会导致主线程消息队列过载,并在调用onPostExecute之前造成长时间延迟。解决方法是每秒仅发布一次。

我使用System.currentTimeMillis()函数计算了每次我向处理程序发送请求的时间间隔(以秒为单位)。 - marcinj

0
对我来说,这是用户错误。我在结束AsyncTask时调用了cancel(true),没有仔细阅读文档以了解在这种情况下不会调用onPostExecute,而是调用onCancelled。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接