永远不会调用AsyncTask onPostExecute

dda*_*ian 39 android android-asynctask

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

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

    new PostToOpenFeint.execute();
    
    Run Code Online (Sandbox Code Playgroud)

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();
  }
Run Code Online (Sandbox Code Playgroud)

进一步研究,这是我能够观察到的.例如,如果我拨打此电话:

 new PostToOpenFeint.execute();
Run Code Online (Sandbox Code Playgroud)

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

settingsButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
   new PostToOpenFeint.execute();
}
});
Run Code Online (Sandbox Code Playgroud)

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

小智 73

我刚才有一个类似的问题.我正在扩展AsyncTask<Integer,Integer,Integer>,我的onPostExecute方法看起来像:

protected void onPostExecute(int result)
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎没问题,但是我再次成为一个.NET人而不是Java人.我改成了:

protected void onPostExecute(Integer result)
Run Code Online (Sandbox Code Playgroud)

因为某些原因Java认为int和之间存在差异Integer

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

extends<Void,Void,Void>
Run Code Online (Sandbox Code Playgroud)

这意味着没有参数,没有进展,没有结果.如果你想在它完成时执行某些东西,我认为你需要给它一些类似的值,如整数或布尔值.

如果您将您的延伸更改为:

<Void,Void,Integer>
Run Code Online (Sandbox Code Playgroud)

现在你传递没有参数,不发布任何进展,但返回一个值.更改您的onPostExecute方法以接受Integer:

protected void onPostExecute(Integer result)
Run Code Online (Sandbox Code Playgroud)

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

return 1;
Run Code Online (Sandbox Code Playgroud)

然后它应该为你执行.

  • int和Integer之间有区别.Integer是一个对象,可以为null,int是原始的,不能为null.当您调用的函数返回一个Integer时,当您尝试将其存储到int时,您会被空指针异常所迷惑,这一点尤为重要. (20认同)
  • +1代表:"java认为int和Integer之间存在差异" (11认同)
  • 只是提示或建议:您实际上可以通过使用@Override注释标记重写方法来利用编译器来检测此类问题.在onPostExecute(int result)的情况下,它会显示一个错误,表明没有这样的带有int参数的超级方法.顺便说一下,Void结果值也可以正常工作. (3认同)

小智 12

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

必须在UI线程上加载AsyncTask类.这是从JELLY_BEAN开始自动完成的.

说文档.在姜饼(可能在之前),在适当的情况下,这导致onPostExecute不运行.然而,解决方案很简单,只需一个

new MyAsyncTask();
Run Code Online (Sandbox Code Playgroud)

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

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

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


Pau*_*sma 9

请注意,如果您通过取消任务cancel(),onPostExecute()将不会被调用.非常符合逻辑,但只是忽略了对该方法的调用让我难过.


Oz *_*ano 7

我的问题是,我没有正确地@Override onPostExecute方法.我通过单击鼠标右键 - > source-> Override\Implement方法修复了该问题.

希望它可以帮助某人