dda*_*ian 39 android android-asynctask
我不确定我做错了什么,但onPostExecute永远不会被调用.
从我做的主要活动的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)
然后它应该为你执行.
小智 12
还有一个关于AsyncTasks的问题,我只花了半天时间:
必须在UI线程上加载AsyncTask类.这是从JELLY_BEAN开始自动完成的.
说文档.在姜饼(可能在之前),在适当的情况下,这导致onPostExecute不运行.然而,解决方案很简单,只需一个
new MyAsyncTask();
Run Code Online (Sandbox Code Playgroud)
在UI线程的早期,所以在后台的任何内容无意中加载之前,类都会被加载.
我在后台线程的AsyncTask子类中使用了一个静态函数,根据时间的推移,在使用AsyncTask子类的UI线程和bingo之前调用了一个很好的Heisenbug.
(跟我一起回答这个旧的,已经回答的问题,但我没有在任何地方找到那些信息,这是我的第一篇文章)
我的问题是,我没有正确地@Override onPostExecute方法.我通过单击鼠标右键 - > source-> Override\Implement方法修复了该问题.
希望它可以帮助某人