AsyncTask onPostExecute永远不会被调用

我不知道我在做什么错,但onPostExecute永远不会被调用。

  • 创build了一个名为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活动后,一切正常。 如果我把这个调用放在一个button监听器里面。

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

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

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

 protected void onPostExecute(int result) 

这对我来说似乎是可以的,但是我再次是一个.NET人,而不是Java人。 我把它改成:

 protected void onPostExecute(Integer result) 

因为Java认为intInteger有区别吗?

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

 extends<Void,Void,Void> 

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

如果你改变你的延伸到:

 <Void,Void,Integer> 

现在你没有任何参数,没有发表任何进展,但正在返回一个价值。 改变你的onPostExecute方法来接受一个Integer

 protected void onPostExecute(Integer result) 

然后将doInBackground方法中的返回更改为如下所示的内容:

 return 1; 

那么它应该为你执行。

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

AsyncTask类必须在UI线程上加载。 这从JELLY_BEAN自动完成。

说文档。 在姜饼(可能之前),给出正确的情况下,这导致onPostExecute不运行。 然而,解决scheme很简单,只是一个

 new MyAsyncTask(); 

在UI线程的早期,所以在后台的任何东西可能会无意中加载它的类加载。

我在后台线程的AsyncTask子类中使用了一个静态函数,根据时间的不同,在UI线程上的任何东西都使用了AsyncTask子类,宾果,一个很好的Heisenbug。

(忍受我回答这个老问题,已经回答了问题,但是我没有发现任何信息的珍闻,这是​​我的第一篇文章)

请注意,如果您通过cancel()取消任务 ,则不会调用onPostExecute() 。 非常合乎逻辑,但只是忽略了对这种方法的呼叫让我难住了。

我的问题是,我没有@Override onPostExecute方法正确。 我通过单击鼠标右键 – >源 – >覆盖\实施方法来解决这个问题。

希望它可以帮助别人

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

只需将此代码添加到您的活动。 它的asynchronous任务的问题不正确地初始化,因为它应该做的。

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

只需更改onPostExecute中的参数

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

现在该方法应该被调用。

只需使用onPostExecute中的正确参数,使用public void onPostExecute(Boolean response){}而不是public void onPostExecute(boolean response){}解决了我的问题