AsyncTask никогда не выполняет onPostExecute

Я пытаюсь выполнить следующую 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 зависающего, нормально, даже если вы используете только один (как в моем случае) на данный момент.

Здесь нет 1 большой части, о которой вы должны узнать.

Из документов разработчика (см. Жирный текст ниже): http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean )

Попытка отменить выполнение этой задачи. Эта попытка потерпит неудачу, если задача уже завершена, уже отменена или не может быть отменена по какой-либо другой причине. В случае успеха, и эта задача не началась при вызове отмены, эта задача никогда не должна выполняться. Если задача уже запущена, параметр mayInterruptIfRunning определяет, должен ли поток, выполняющий эту задачу, прерваться при попытке остановить задачу.

Вызов этого метода приведет к вызову onCancelled (Object) в потоке пользовательского интерфейса после возврата doInBackground (Object []). Вызов этого метода гарантирует, что onPostExecute (Object) никогда не вызывается. После вызова этого метода вы должны периодически проверять значение, возвращаемое isCancelled (), из doInBackground (Object []), чтобы завершить задачу как можно раньше.

Android использует onCancelled (), когда задача отменена, она не вызывает onPostExecute!

Я думаю, что вызов отменить фактически отменяет все от выполнения, в том числе onPostExecute. Вы должны использовать свою собственную локальную переменную boolean и сделать это:

 private boolean shouldContinue = true; public void customCancel() { shouldContinue = false; } 

То в вашей петле выполните следующее:

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