AsyncTask永远不会执行onPostExecute

时间:2011-11-21 22:01:11

标签: android android-asynctask

我正在尝试执行以下AsyncTask:

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");
         }

    }

因此,当我在此任务上调用cancel(false)时,onPostExecute应该被执行,但它永远不会被执行。

代码或其他什么问题? 我已经在SO中查看了很多答案,看起来#5 AsyncTask闲置是正常的,即使你现在只使用一个(如我的情况)。

3 个答案:

答案 0 :(得分:10)

这里缺少一件你必须了解的大片。

来自开发者文档(请参阅下面的粗体文字):http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean

  

尝试取消执行此任务。如果这种尝试失败了   任务已经完成,已经取消,或者不能   由于其他原因被取消。如果成功,这个任务就有了   调用cancel时未启动,此任务永远不会运行。如果   任务已经启动,然后是mayInterruptIfRunning参数   确定执行此任务的线程是否应该是   因试图停止任务而中断。

     

调用此方法将导致调用onCancelled(Object)   在doInBackground(Object [])返回后的UI线程上。的调用   此方法保证永远不会调用onPostExecute(Object)。   调用此方法后,应检查返回的值   isCancelled()定期从doInBackground(Object [])来完成   尽早完成任务。

答案 1 :(得分:3)

Android在取消任务时使用onCancelled(),它不会调用onPostExecute!

答案 2 :(得分:2)

我认为调用cancel实际上会取消执行所有内容,包括onPostExecute。您应该使用自己的本地布尔变量并执行此操作:

private boolean shouldContinue = true;

public void customCancel() 
{
       shouldContinue = false;
}

然后在你的循环中执行此操作:

if (!shouldContinue)
{
    Log.w("TAG", "task interrumped");
    return null;
}