【问题标题】:AsyncTask onPostExecute never gets calledAsyncTask onPostExecute 永远不会被调用
【发布时间】:2011-05-28 12:58:00
【问题描述】:

我不确定我做错了什么,但 onPostExecute 永远不会被调用。

  • 创建了一个名为 BaseActivity.java 的基类
  • 从我原来的 Activity 我扩展了这个类。
  • 在 BaseActivity 中放置 PostToOpenFeint 类
  • 从我正在做的主要活动的 UI 线程中调用它:

    new PostToOpenFeint.execute();
    

onPreExecute()、doInBackground(..) 被触发,但由于某种原因,onPostExecute 永远不会被调用。

提前感谢您!

戴夫

 private class PostToOpenFeint extends AsyncTask<Void, Void, Void> {
  /*
   * (non-Javadoc)
   * 
   * @see android.os.AsyncTask#doInBackground(Params[])
   */
  @Override
  protected Void doInBackground(Void... params) {
   // does all the work here
   return null;
  }


  /*
   * (non-Javadoc)
   * 
   * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
   */
  @Override
  protected void onPostExecute(Void result) {
   // TODO Auto-generated method stub
   super.onPostExecute(result);
   Toast.makeText(MainScreen.this, "Done syncing", Toast.LENGTH_LONG).show();
  }

  /*
   * (non-Javadoc)
   * 
   * @see android.os.AsyncTask#onPreExecute()
   */
  @Override
  protected void onPreExecute() {
   // TODO Auto-generated method stub
   super.onPreExecute();
   Toast.makeText(MainScreen.this, "About to sync all your scores", Toast.LENGTH_LONG).show();
  }

深入研究,这是我能够观察到的。例如,如果我拨打这个电话:

 new PostToOpenFeint.execute();

在 Activity 的 onCreate 之后,一切正常。如果我将此调用放在按钮侦听器中。

settingsButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
   new PostToOpenFeint.execute();
}
});

onPostExecute() 永远不会被调用,不确定我做错了什么。我读到的限制是从 UI 线程调用它,我从 UI 线程调用它。

【问题讨论】:

  • 请修正您的帖子标题:ActiveTask 应该替换为 AsyncTask
  • 啊,谢谢你,好像有人抢了我。
  • 你解决过这个问题吗?我现在有同样的问题。从按钮的 onClickListener 调用时的行为相同。
  • 没关系,我没有在任务上调用 execute()(就像我对所有其他任务所做的那样),而是直接调用了 doInBackground()……我不知道这是怎么发生的。 :-P
  • @Bashorings 直接调用 doInBackground 不是一个好主意,它违背了异步任务从 UI 线程同步调用其所有方法的目的

标签: android android-asynctask


【解决方案1】:

也许 doInBackground() 中的代码永远不会返回?

【讨论】:

  • 我遇到了这个问题,并且 100% 确定我在 doInBackground() 调用结束时返回了一个有效的位图,但如果这有什么不同,它就在 GL 线程中?
【解决方案2】:

我刚才遇到了类似的问题。我正在扩展 AsyncTask&lt;Integer,Integer,Integer&gt;,我的 onPostExecute 方法看起来像:

protected void onPostExecute(int result)

这对我来说似乎没问题,但话说回来,我更像是一个 .NET 人而不是 Java 人。 我把它改成:

protected void onPostExecute(Integer result)

因为某种原因,Java 认为 intInteger 之间存在差异?

我认为您的问题是您将返回类型声明为 void 在您的:

extends<Void,Void,Void>

这意味着没有参数,没有进展,也没有结果。如果您想在完成后执行某事,我认为您需要给它某种值,例如整数或布尔值。

如果您将扩展更改为:

<Void,Void,Integer>

现在您没有传递任何参数,没有发布任何进度,而是返回一个值。更改您的 onPostExecute 方法以接受 Integer

protected void onPostExecute(Integer result)

然后将 doInBackground 方法中的返回值更改为:

return 1;

然后它应该为你执行。

【讨论】:

  • +1 for:"java 认为 int 和 Integer 之间有区别"
  • int 和 Integer 是有区别的。 Integer 是对象,可以为 null,int 是原始类型,不能为 null。当您调用的函数返回 Integer 并且当您尝试将其存储到 int 时被空指针异常迷惑时,这一点尤其重要。
  • 只是一个提示或建议:您实际上可以通过使用 @Override 注释标记覆盖的方法来利用编译器来检测此类问题。在 onPostExecute(int result) 的情况下,它会显示一个错误,表明没有这样的带有 int 参数的超级方法。顺便说一句,Void 结果值也同样有效。
  • 同样在 Xamarin 中,如果要传递自定义对象或 C# 对象,请确保将这些对象扩展为 Java.Lang.Object
【解决方案3】:

我的问题是我没有正确地@Override onPostExecute 方法。我通过单击鼠标右键->源-> Override\Implement 方法解决了这个问题。

希望对某人有所帮助

【讨论】:

    【解决方案4】:

    请注意,如果您cancel the task via cancel()onPostExecute() 将不会被调用。非常合乎逻辑,但只是忽略了对该方法的调用让我很难过。

    【讨论】:

      【解决方案5】:

      只需将此代码添加到您的活动中。它的问题是异步任务没有按预期正确初始化。

                try {
                      Class.forName("android.os.AsyncTask");
                  } catch (ClassNotFoundException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
      

      【讨论】:

        【解决方案6】:

        还有一个关于 AsyncTasks 的问题,我刚刚花了半天时间:

        必须在 UI 线程上加载 AsyncTask 类。这个做完了 从 JELLY_BEAN 自动开始。

        说文档。在 Gingerbread 上(可能之前),在适当的情况下,这会导致 onPostExecute 没有运行。然而,解决方案很简单,只需一个

        new MyAsyncTask();
        

        在 UI 线程的早期,因此在后台的任何内容可能无意中加载它之前加载类。

        我在我的 AsyncTask 子类中使用了一个来自后台线程的静态函数,根据时间的不同,它在 UI 线程上的任何内容使用该 AsyncTask 子类和宾果游戏之前被调用,这是一个不错的 Heisenbug。

        (请耐心回答这个已回答的老问题,但我在任何地方都没有找到该信息,这是我的第一篇文章)

        【讨论】:

          【解决方案7】:

          只需更改 onPostExecute 中的参数

          @Override
          protected void onPostExecute(Void unused) {
          ...}
          

          现在应该调用该方法。

          【讨论】:

            【解决方案8】:

            只需在 onPostExecute 中使用正确的参数, 采用 public void onPostExecute(布尔响应) { } 代替 公共无效 onPostExecute(布尔响应) { } 这解决了我的问题

            【讨论】:

            • 我觉得不应该是public void onPostExecute,应该是protected void onPostExecute
            【解决方案9】:

            只需 return 一些东西而不是 null,它就会起作用!
            例如:
            return "done";

            【讨论】:

              【解决方案10】:

              我也遇到了同样的问题 做错了什么是我试图在不同的范围内编写方法 该方法只会在您在doInBackground 方法之后和PostToOpenFeint 类(在这种情况下)内部编写时触发

              【讨论】:

                猜你喜欢
                • 2016-07-20
                • 2013-11-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-10-27
                • 2013-10-12
                相关资源
                最近更新 更多