2011-06-30 19 views
51

Cómo hacer que la tarea Async se ejecute repetidamente después de un intervalo de tiempo como Temporizador ... En realidad, estoy desarrollando una aplicación que descargará automáticamente los últimos mensajes no leídos del servidor y para Para eso tengo que buscar actualizaciones del servidor después de unos intervalos de tiempo fijos ... Sé que se puede hacer fácilmente a través del temporizador, pero quiero usar una tarea asíncrona que creo que es más eficiente para las aplicaciones de Android.Cómo ejecutar la tarea Async repetidamente después de intervalos de tiempo fijos

Respuesta

108
public void callAsynchronousTask() { 
    final Handler handler = new Handler(); 
    Timer timer = new Timer(); 
    TimerTask doAsynchronousTask = new TimerTask() {  
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() {  
        try { 
         PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask(); 
         // PerformBackgroundTask this class is the class that extends AsynchTask 
         performBackgroundTask.execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(doAsynchronousTask, 0, 50000); //execute in every 50000 ms 
} 
+1

muchas gracias .... – Waseem

+3

Una tarea asíncrona funciona de todos modos en su propio hilo. ¿Por qué ejecutarlo en un controlador? – Siddharth

+9

Sí, la tarea asíncrona se ejecuta en un subproceso independiente, pero no se puede iniciar desde otros subprocesos que el subproceso de interfaz de usuario. El controlador, creo, está ahí para permitir eso. – r1k0

2

Usted puede simplemente un controlador:

private int m_interval = 5000; // 5 seconds by default, can be changed later 
private Handle m_handler; 

@Override 
protected void onCreate(Bundle bundle) 
{ 
    ... 
    m_handler = new Handler(); 
} 

Runnable m_statusChecker = new Runnable() 
{ 
    @Override 
    public void run() { 
      updateStatus(); //this function can change value of m_interval. 
      m_handler.postDelayed(m_statusChecker, m_interval); 
    } 
} 

void startRepeatingTask() 
{ 
    m_statusChecker.run(); 
} 

void stopRepeatingTask() 
{ 
    m_handler.removeCallback(m_statusChecker); 
} 

Pero le recomiendo que comprobar este marco: http://code.google.com/intl/de-DE/android/c2dm/ es un enfoque diferente: el servidor notificará al teléfono cuando algo está listo (por lo tanto, ahorrar algo de ancho de banda y :) rendimiento)

+0

gracias alot.Actually estoy comenzando a desarrollar el lado del cliente del lado application.Server ya está trabajando para la misma aplicación desarrollada para iPhone y me tienen que usar el mismo servidor para android – Waseem

+1

Soy nuevo a enhebrar en android ¿A dónde le pasa el ejecutable al manejador? –

+2

para responder @DheeB, el que responde no lo menciona aquí, aunque debería ser durante la creación de instancias como este m_handler = new Handler (m_statusChecker); Otro motivo por el que esta solución podría no funcionar, porque la pregunta indica claramente que habrá operaciones de red que "descargarán automáticamente todos los últimos mensajes de bienvenida no leídos del servidor". Sin embargo, aunque esté utilizando un controlador, este manejador/ejecutable aún se está ejecutando. en el hilo de UI que todavía está bloqueando. Debe iniciarlo manualmente en un hilo separado. – tony9099

2

¿no sería más eficiente para crear un servicio y programarlo a través del Administrador de alarma?

+1

Crear un servicio es un dolor, entonces muchas cosas para cuidar en un servicio. Prefiero usar un temporizador. – Siddharth

+2

Los servicios son fáciles de iniciar y detener. Además, no están vinculados al hilo de UI. Entonces sí, utilizaría un servicio. –

+0

@IgorGanapolsky sí lo son. Pero también son una molestia, ¿por qué crearían asyntask, timer y estos módulos para operaciones más pequeñas si no tuvieran sentido y todo se hiciera a través de un servicio? – tony9099

6
//Every 10000 ms 
     private void doSomethingRepeatedly() { 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 

        try{ 

        new SendToServer().execute(); 

        } 
        catch (Exception e) { 
         // TODO: handle exception 
        } 

      } 
      }, 0, 10000); 
        } 
+2

Se recomienda utilizar ScheduledThreadPoolExecutor over Timer para todos los códigos nuevos en la documentación de Android https://developer.android.com/reference/java/util/Timer.html –

Cuestiones relacionadas