建成后的AsyncTask不onPostExecute叫
-
25-09-2019 - |
题
有关某种原因,我onPostExecute()
没有我的AsyncTask
完成之后被调用。
我类decleration:
public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean>
我onPostExecute():
protected void onPostExecute(Boolean result)
一切正常,我doInBackground()
成功完成,并返回一个布尔但当时它只是完成。
由于
解决方案
你创建你的UI线程上的AsyncTask?也针对您的onPostExecute()方法添加一个@Override批注,以确保你正确地宣布它。
其他提示
你开始execute()
方法的任务是什么?该onPostExecute
不会,如果你只是调用doInBackground
运行。
实测值/由另一种讨厌的错误:
如果您onPostExecute(Param param)
的PARAMS不匹配你extends AsyncTask<...,...,Param>
定义的,你没有使用@Override
注解,它永远不会被执行,你不从Eclipse中得到警告。
注意自己:
只是一直使用@Override
注释和Eclipse会帮助你。
另一种简单的方法来避免所有命名错误:
在Eclipse:Right-click in code > Source > Override/Implement Methods
有同样的问题,并没有回答这些问题帮我之后,我发现我的UI线程被阻塞(我用的 CountDownLatch.await()
),因此是应该由UI线程调用该方法onPostExecute()
从未被调用。
由另一种讨厌的错误,可能导致同样的错误。当定义的AsyncTask并调用它,我是不是主叫execute
但被调用doInBackground
new AsyncTask<String,Void,Void>() {
....
}.doInBackground("parameter");
,而不是
new AsyncTask<String,Void,Void>() {
....
}.execute("parameter");
我面临同样的问题。上述解决方案都没有为我工作。然后,我想通了这个问题,也许它可以帮助别人。
在UI线程我调用以下代码:
public class XActivity ...{
onCreate(){
....
new SaveDrawingAsync(this).execute();
while(true)
{
if(MandalaActivity.saveOperationInProgress){
continue;
}
super.onBackPressed();
break;
}
...
}
}
我的AsyncTask类定义:
public class SaveAsync extends AsyncTask<Object, Void, Void> {
@Override
public Void doInBackground(Object... params) {
saveThem(); // long running operation
return null;
}
@Override
public void onPostExecute(Void param) {
XActivity.saveOperationInProgress = false;
}
@Override
public void onPreExecute() {
XActivity.saveOperationInProgress = true;
}
}
在上面的代码onPostExecute不被调用。这是因为执行的AsyncTask后一个无限循环的。 的AsyncTask和inifinite环都等待海誓山盟到结束。因此,该代码stucks!
将溶液改变设计!
我有相同的行为,并且原因是,我已经发布了大量消息的作为内部doInBackground进度与以下代码:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// .. some UI updates
}
});
此必须具有重载主thrad消息队列,并造成长时间的延迟onPostExecute将被调用之前。解决的办法是仅发布每秒一次。
对我来说是用户错误。我被它调用取消(真),而不是阅读文档不够紧密知道onPostExecute是不是在这种情况下,所谓的结束的AsyncTask,onCancelled是。