我不确定我做错了什么,但onPostExecute永远不会被调用。
从我正在进行的主要活动的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线程调用它。
答案 0 :(得分:73)
我刚才遇到了类似的问题。我正在扩展AsyncTask<Integer,Integer,Integer>
,我的onPostExecute方法看起来像:
protected void onPostExecute(int result)
这对我来说似乎没问题,但是我再次成为一个.NET人而不是Java人。 我改成了:
protected void onPostExecute(Integer result)
因为某些原因Java认为int
和Integer
之间存在差异?
我认为您的问题是您在以下内容中将返回类型声明为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
类内部(在这种情况下)编写时触发。