AsyncTask永远不会执行onPostExecute

Nik*_*koi 3 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");
         }

    }
Run Code Online (Sandbox Code Playgroud)

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

代码中还有其他问题吗?我已经在SO中查看了很多答案,而且看起来#5 AsyncTask悬挂是正常的,即使你现在只使用一个(如我的情况).

jam*_*mes 10

这里有一大块缺失,你必须要了解.

来自开发人员文档(参见下面的粗体文本):http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean)

尝试取消执行此任务.如果任务已经完成,已经取消或由于某些其他原因无法取消,则此尝试将失败.如果成功,并且在调用cancel时此任务尚未启动,则此任务永远不会运行.如果任务已经启动,则mayInterruptIfRunning参数确定执行此任务的线程是否应该在尝试停止任务时被中断.

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