Sé que esto fue hace un tiempo, y tú has resuelto tu problema. pero acabo de tener un problema similar. La sugerencia de Reno me puso en el camino correcto, pero para aquellos que han tenido dificultades para llenar los vacíos. Aquí es cómo superé un problema similar al de katit.
Quería que una AsyncTask en particular se ejecutara solo si no se estaba ejecutando actualmente. Y como un avance de la sugerencia de Reno, la interfaz AsyncTask se ha creado para manejar todos los procesos esenciales en el tratamiento adecuado de los hilos para Android. Lo que significa que el Ejecutor está integrado. Como esto blog sugiere:
"Cuando se ejecuta execute (Object .. params) en una AsyncTask, la tarea se ejecuta en una cadena de fondo. Dependiendo de la plataforma, AsyncTasks se puede ejecutar en serie (pre 1.6 y potencialmente de nuevo en 4+), o concurrentemente (1.6-3.2).
Para estar seguro de ejecutar en serie o al mismo tiempo como lo requiera, desde API Nivel 11 en adelante puede usar executeOnExecutor (Executor executor, Object .. params) método en su lugar, y el suministro de un ejecutor. La plataforma proporciona dos ejecutores para mayor comodidad, accesible como AsyncTask.SERIAL_EXECUTOR y AsyncTask.THREAD_POOL_EXECUTOR respectivamente. "
Así que con esto en mente, usted puede hacer hilo de bloqueo a través de la interfaz AsyncTask, también implica que puede simplemente usar el AsyncTasks.getStatus() para manejar el bloqueo de rosca, como se sugiere en este Deev post.
en mi código, he conseguido esto mediante:
Creación de una variable global definida como:
private static AsyncTask<String, Integer, String> mTask = null;
Y en onCreate, inicializar como una instancia de mi AsyncTask llamada CalculateSpecAndDraw:
mTask = new CalculateAndDrawSpec();
Ahora, cuando cada vez que deseo llamar a este AsyncTask que rodean la ejecución de lo siguiente:
if(mTask.getStatus() == AsyncTask.Status.FINISHED){
// My AsyncTask is done and onPostExecute was called
mTask = new CalculateAndDrawSpec().execute(Integer.toString(progress));
}else if(mTask.getStatus() == AsyncTask.Status.PENDING){
mTask.execute(Integer.toString(progress));
}else{
Toast.makeText(PlaySpecActivity.this, "Please Wait..", 1000).show();
}
Esto genera un nuevo hilo si se ha terminado, o si el estado de rosca está pendiente, el el hilo está definido pero no se ha iniciado, lo iniciamos. De lo contrario, si el hilo se está ejecutando no lo volvemos a ejecutar, simplemente le informamos al usuario que no está terminado o realizamos cualquier acción que deseemos. Luego, si desea programar el próximo evento en lugar de simplemente bloquearlo para que vuelva a estar en ejecución, consulte la documentación de this sobre el uso de ejecutores.
Me temo que si uso el indicador en la aplicación y mi AsyncTask falla por alguna razón - de lo que nunca se ejecutará nuevamente ya que la bandera ya muestra que comenzó – katit