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.
- Cómo pasar datos de AsyncTask a Ui Thread
- ¿AsyncTask sigue esperando?
- Obteniendo NetworkOnMainThreadException mientras integra el API de twitter en android
- Respuesta de retorno de loopj asynchttpclient de Android
- Cómo utilizar AsyncTask correctamente
¿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.
- AsyncTask con un ProgressDialog y barra de progreso
- ¿Cómo puedo ejecutar esta clase en el hilo de interfaz de usuario?
- Hilos y uso de tareas Asynctask para httppost
- ¿Cuál es la forma más eficiente en Android de llamar a las llamadas de la API Web HTTP que devuelven una respuesta JSON?
- Android - notifyDataSetChanged () y subprocesos
- Android AsyncTask como argumento del método
- Necesito saber cuánto bytes se ha cargado para actualizar una barra de progreso android
- Cargar anuncio (adMob) en el subproceso de fondo
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; }