【问题标题】:onPostExecute not called after completion AsyncTask完成 AsyncTask 后未调用 onPostExecute
【发布时间】:2011-04-06 02:39:43
【问题描述】:

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

我的班级声明:

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

我的 onPostExecute():

protected void onPostExecute(Boolean result)

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

谢谢

【问题讨论】:

    标签: java android android-asynctask


    【解决方案1】:

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

    【讨论】:

    • 我那里没有@Override。查看示例 (developer.android.com/reference/android/os/AsyncTask.html) 他们也没有。为什么我必须有一个 onPostExecute() 而其他一个都没有?
    • 它似乎可以在模拟器上运行,但不能在手机上运行。当后台进程完成时,不会出现 Toast 通知。布局看起来确实因为某些未知原因而重新加载。有什么想法吗?
    • 您不必拥有@Override,但这是确保您正确覆盖该方法的一种方式。
    • 我犯了使用 OnPostExecute 而不是 'onPostExecute' 的错误。感谢您的提示 :)
    • 我在 UI 线程之外创建了 Asynctask。感谢您的解决!
    【解决方案2】:

    您是否使用execute() 方法开始任务?如果您只调用 doInBackgroundonPostExecute 将不会运行。

    【讨论】:

    • 帮助了我。很好的答案。谢谢。
    • @Konstantin 比如何调用onpostexecute()?
    • @developer onPostExecute 会在 doInBackground 返回后自动为您调用。除非在异步任务上调用了取消。
    • @KonstantinBurov 是的,现在它正在工作。谢谢 :)
    【解决方案3】:

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

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

    对自己的注意: 只需始终使用 @Override 注释,Eclipse 会帮助您。

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

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

    【讨论】:

    • 我刚刚在这里解决了我同事的问题 - 他使用的是布尔值而不是布尔值!
    【解决方案4】:

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

    【讨论】:

    • 谢谢,这节省了我几个小时!
    【解决方案5】:

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

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

    这一定是主线程消息队列超载,并且在 onPostExecute 被调用之前造成了长时间的延迟。解决方案是每秒只发布一次。

    【讨论】:

    • 我计算了每次发布到处理程序之间的秒数(使用 System.currentTimeMillis())
    【解决方案6】:

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

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

    而不是

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        我也遇到过同样的问题。以上解决方案都不适合我。然后我发现问题可能对其他人有帮助。

        在 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 和无限循环都在等待对方完成。因此代码卡住了!

        解决方案是改变设计!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多