Ver Mensaje Individual
  #4 (permalink)  
Antiguo 31/07/2014, 08:07
Avatar de El_Metallick
El_Metallick
 
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.718
Antigüedad: 22 años, 1 mes
Puntos: 16
Respuesta: Limitar el tiempo de ejecución de un hilo AsyncTask

Primero que todo, sumarme a lo que dice razpeitia con respecto al uso de webservices como método de comunicación entre la aplicación Android y el servidor de base de datos. En este post comente algo de lo que ha sido mi experiencia con el uso de webservices.

Ahora, con respeto a tu pregunta sobre limitar el tiempo de vida de una tarea asíncrona, o en su defecto, darle un timeout, la verdad es que no se si existe una forma directa pero al menos cuando yo lo necesité hacer, lo solucione de la siguiente manera:

Código Java:
Ver original
  1. boolean flag = true;
  2.  
  3. miTareaAsincrona = new __TareaAsincrona();
  4. miTareaAsincrona.execute(Params...);
  5.  
  6. miHandler = new Handler();
  7.  
  8. miRunnable = new Runnable() {
  9.     @Override
  10.     public void run() {
  11.         if(flag) {
  12.             flag = false;
  13.         } else {
  14.             miTareaAsincrona.cancel(true);
  15.  
  16.                 //Lo que sea necesario hacer al cancelar la tarea
  17.         }
  18.  
  19.         miHandler.postDelayed(this,10000);
  20.     }
  21. };
  22.  
  23. miRunnable.run();

Explicación: En realidad lo que se hace, es una ejecución repetitiva cada 10 segundos en este caso (dado por los 10000). La primera vez que entra, como la flag es verdadero, simplemente cambia la flag a falso, si luego de 10 segundos (periodo en el que se vuelve a ejecutar el fragmento de código) aún no ha concluido la tarea asíncrona, pues la cancelo y realizo alguna acción de ser necesario.

IMPORTANTE: Para el correcto funcionamiento, es necesario decirle a la tarea repetitiva que no es necesario que se siga ejecutando una vez que responde la tarea asíncrona, esto a grandes rasgos sería mas o menos así:

Código Java:
Ver original
  1. private class __TareaAsincrona extends AsyncTask<String, Void, Boolean> {
  2.     protected Boolean doInBackground(String... params) {
  3.         if (this.isCancelled()) {
  4.             return null;
  5.         }      
  6.        
  7.         //lo que haga la tarea asíncrona
  8.  
  9.         return ture|false;
  10.     }
  11.    
  12.     protected void onPostExecute(Boolean result) {
  13.         if(!this.isCancelled()) {
  14.             if(result) {
  15.                 miHandler.removeCallbacks(miRunnable);
  16.  
  17.                 //lo que tenga que hacer cuando termina la tarea asíncrona
  18.             }
  19.         }
  20.     }
  21. }

Espero se entienda la idea y te sea de ayuda.

Salud(os)
__________________
Haz la guerra en la cama y el amor donde se te de la gana...
El tiempo es el mejor maestro, lo único malo es que te mata...¡¡Aprovecha tu tiempo!!