AsyncTask nunca se ejecuta onPostExecute

Estoy intentando ejecutar el AsyncTask siguiente:

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

Así que cuando llamo cancel(false) en esta tarea, onPostExecute debe ser ejecutado pero nunca lo es.

¿Hay algún problema en el código o en otra cosa? He mirado un montón de respuestas en SO y parece que tener # 5 AsyncTask colgando alrededor es normal, incluso si usted está usando sólo uno (como en mi caso) en este momento.

Hay 1 pieza grande que falta aquí que usted debe aprender alrededor.

desde el desarrollador docs (ver texto en negrita a continuación): http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean )

Intenta cancelar la ejecución de esta tarea. Este intento fallará si la tarea ya se ha completado, ya se ha cancelado o no se ha podido cancelar por alguna otra razón. Si tiene éxito, y esta tarea no ha comenzado cuando se llama cancelar, esta tarea nunca debe ejecutarse. Si la tarea ya se ha iniciado, el parámetro mayInterruptIfRunning determina si el subproceso que ejecuta esta tarea debe interrumpirse en un intento de detener la tarea.

Llamar a este método resultará en onCancelled (Object) que se invoca en el subproceso de interfaz de usuario después de doInBackground (Object []) devuelve. Al llamar a este método se garantiza que onPostExecute (Object) nunca se invoca. Después de invocar este método, debe comprobar el valor devuelto por isCancelled () periódicamente desde doInBackground (Object []) para finalizar la tarea tan pronto como sea posible.

Android use onCancelled () cuando la tarea se cancela, no llame a onPostExecute!

Creo que la cancelación de llamada realmente cancela todo desde la ejecución, incluido el onPostExecute. Debe utilizar su propia variable booleana local y hacer esto:

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

entonces en tu bucle haz esto:

 if (!shouldContinue) { Log.w("TAG", "task interrumped"); return null; } 
  • Android AsyncTask onPostExecute fuera del hilo principal de ui
  • AsyncTask - descarga lenta
  • ¿Por qué mis hilos no mueren y causan una pérdida de memoria?
  • Cargando en segundo plano - AndEngine GLES2
  • GetSupportFragmentManager () causa java.lang.IllegalStateException: No se puede realizar esta acción después de onSaveInstanceState
  • Descargar archivo como Android Market
  • Omitió 60 cuadros! La aplicación puede estar haciendo demasiado trabajo en su hilo principal
  • ¿Puedo agregar más de un AsyncTask y ejecutar simultáneamente?
  • El selector de intenciones permanece abierto cuando usa un subproceso para obtener un recurso de imagen
  • Android: Cargando una imagen desde la Web con Asynctask
  • Retrofit call dentro de AsyncTask
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.