Android AsyncTask从不在PostExecute上执行
我正在尝试执行以下异步任务:Android AsyncTask从不在PostExecute上执行,android,android-asynctask,Android,Android Asynctask,我正在尝试执行以下异步任务: private class TimeUpdateTask extends AsyncTask<List<mObject>, Integer, Void> { @Override protected Void doInBackground(List<mObject>... params) { mObject o; int i;
private class TimeUpdateTask extends AsyncTask<List<mObject>, Integer, Void> {
@Override
protected Void doInBackground(List<mObject>... params) {
mObject o;
int i;
int numChecked = 0;
List<mObject> mObjects = params[0];
while(true)
{
if (isCancelled())
{
Log.w("TAG", "task interrumped");
return null;
}
for (i=0 ; i < mObjects.size() ; i++)
{
o = mObjects.get(i);
if (!o.isChecked())
{
o.calculateProgress();
if (o.isChecked())
{
numChecked++;
}
}
}
publishProgress(numChecked);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
@SuppressWarnings("unchecked")
@Override
protected void onProgressUpdate(Integer... param){
int progressCompleted = param[0];
((ArrayAdapter<mObject>) EventListView.this.EventView.getAdapter()).notifyDataSetChanged();
mMain.setProgressBarCompleted(progressCompleted);
}
/*This should execute*/
@Override
protected void onPostExecute(Void result) {
Log.d("TAG","End onPostExecute");
}
}
私有类TimeUpdateTask扩展异步任务{
@凌驾
受保护的Void doInBackground(列表…参数){
蒙博托;
int i;
int numChecked=0;
List mObjects=params[0];
while(true)
{
如果(isCancelled())
{
Log.w(“标记”,“任务被中断”);
返回null;
}
对于(i=0;i
因此,当我在此任务上调用cancel(false)
时,应该执行onPostExecute
,但它永远不会执行
代码中有什么问题吗?
我在SO中查看了很多答案,似乎有#5
AsyncTask
在周围徘徊是正常的,即使您目前只使用一个(如我的情况)也是如此。这里缺少一个大片段,您必须了解
从开发人员文档(请参见下面的粗体文本):)
试图取消此任务的执行。如果
任务已完成、已取消或无法执行
由于其他原因被取消。如果成功,此任务已完成
调用cancel时未启动,此任务不应运行。如果
任务已启动,则MayInterruptFrunning参数
确定执行此任务的线程是否应
在试图停止任务时被中断
调用此方法将导致调用onCancelled(对象)
在doInBackground(对象[])返回后的UI线程上呼叫
此方法保证永远不会调用onPostExecute(对象)。
调用此方法后,应检查
定期从doInBackground(对象[])执行isCancelled()以完成
尽早完成任务
我认为调用cancel实际上会取消执行过程中的所有操作,包括onPostExecute。您应该使用自己的局部布尔变量并执行以下操作:
private boolean shouldContinue = true;
public void customCancel()
{
shouldContinue = false;
}
然后在循环中执行以下操作:
if (!shouldContinue)
{
Log.w("TAG", "task interrumped");
return null;
}
Android使用onCancelled()当任务被取消时,它不会调用onPostExecute 感谢您指出这一点。现在一切都变得更有意义了:)“调用此方法可确保永远不会调用onPostExecute(对象)。-这就是为什么OP从未看到调用
onPostExecute(…)
方法的原因+1令人担忧的是,这毫无意义-当onCancelled()
被调用时,doInBackground(…)
方法将已经终止,并且应该继续
在“循环”中没有相关性。除其他注释/答案外,不要使用while(true)
。在(!isCancelled())时尝试-这样更有意义。谢谢,我也这么想:)