2010-05-18 9 views
8

Estoy usando el código siguiente para programar una tarea en Android pero no está dando ningún resultado. Por favor asesórate sobre lo mismo.Programar tarea en android

int delay = 5000; // delay for 5 sec. 
int period = 1000; // repeat every sec. 
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 

    public void run() { 
     Toast.makeText(getApplicationContext(),"RUN!",Toast.LENGTH_SHORT).show(); 
    } 

}, delay, period); 
+0

Para aquellos que quieran programar el inicio/la transmisión del servicio/actividad, echen un vistazo a [AlarmManager] (http://developer.android.com/reference/android/app/AlarmManager.html) –

Respuesta

16

TimerTasks no son ideales para su uso en un entorno androide porque no son sensibles al contexto. Si su contexto desaparece, TimerTask seguirá esperando pacientemente en segundo plano, lo que eventualmente disparará y potencialmente bloqueará su aplicación porque su actividad ya había finalizado. O bien, puede mantener referencias a su actividad después de que se ha cerrado, evitando que sea basura y potencialmente haciendo que su aplicación se quede sin memoria.

En su lugar, use postDelayed(), que cancelará automáticamente la tarea cuando se cierre la actividad.

final int delay = 5000; 
final int period = 1000; 
final Runnable r = new Runnable() { 
    public void run() { 
     Toast.makeText(getApplicationContext(),"RUN!",Toast.LENGTH_SHORT).show(); 
     postDelayed(this, period); 
    } 
}; 

postDelayed(r, delay); 

Por cierto, si alguna vez necesita cancelar su tarea de forma manual, puede utilizar removeCallbacks(r) donde r es el ejecutable informados previamente.

+0

Este código causará pérdida de memoria –

4

Tengo la respuesta según abajo código:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Timer timer = new Timer(); 

    timer.schedule(new ScheduledTaskWithHandeler(), 5000); 

} 

final Handler handler = new Handler() { 

    public void handleMessage(Message msg) { 
     Toast.makeText(getApplicationContext(), "Run!", 
      Toast.LENGTH_SHORT).show(); 
    } 
}; 

class ScheduledTaskWithHandeler extends TimerTask { 

    @Override 
    public void run() { 
     handler.sendEmptyMessage(0); 
    } 
} 
+3

Por favor, llamen a 'postDelayed() 'en cualquier' Vista'. No 'Timer', no' TimerTask', sin hilo adicional y sin necesidad de un 'Handler'. – CommonsWare

+0

@CommonsWare ¿Qué pasa si necesita un temporizador de repetición? – StarDust

+1

@StarDust: llame de nuevo a 'postDelayed()', como parte del trabajo realizado por 'Runnable' que programó con el primer' postDelayed() ': https://github.com/commonsguy/cw-omnibus/tree/ master/Threads/PostDelayed – CommonsWare

Cuestiones relacionadas