永远不会调用AsyncTask onPostExecute

时间:2010-12-20 22:43:44

标签: android android-asynctask

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

  • 创建了一个名为BaseActivity.java的基类
  • 从我原来的活动中我扩展了这个课程。
  • 在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();

在onCreate of the Activity之后,一切正常。如果我把这个电话放在一个按钮监听器里面。

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

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

10 个答案:

答案 0 :(得分:73)

我刚才遇到了类似的问题。我正在扩展AsyncTask<Integer,Integer,Integer>,我的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 :(得分:12)

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

  

必须在UI线程上加载AsyncTask类。这个完成了   自JELLY_BEAN起。

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

new MyAsyncTask();

在UI线程的早期,所以在后台的任何内容无意中加载之前,类都会被加载。

我在后台线程的AsyncTask子类中使用了静态函数,根据时间的推移,在使用AsyncTask子类的UI线程和bingo之前调用了一个很好的Heisenbug。

(跟我一起回答这个旧的,已经回答过的问题,但我没有在任何地方找到这些信息,这是我的第一篇文章)

答案 2 :(得分:9)

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

答案 3 :(得分:7)

我的问题是,我没有正确地@Override onPostExecute方法。我通过点击鼠标右键 - &gt; source-&gt;修复了这个问题。覆盖\实现方法。

希望它可以帮助某人

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

只需更改onPostExecute

中的参数即可
@Override
protected void onPostExecute(Void unused) {
...}

现在应该调用该方法。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

只需返回而不是 null ,它就会起作用!
例如:
return "done";

答案 9 :(得分:0)

我也面临着同样的问题 发生错误的原因是我尝试在其他范围内编写方法 该方法仅在您在doInBackground方法之后并在PostToOpenFeint类内部(在这种情况下)编写时触发。