2010-05-18 5 views
8

J'utilise le code ci-dessous pour programmer une tâche dans android mais cela ne donne aucun résultat. S'il vous plaît conseiller sur le même.Programmer une tâche dans 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

Pour ceux qui veulent planifier le service/début d'activité ou de diffusion, un coup d'oeil à [AlarmManager] (http://developer.android.com/reference/android/app/AlarmManager.html) –

Répondre

16

TimerTask ne sont pas idéales à utiliser dans un environnement Android parce qu'ils ne sont pas sensible au contexte. Si votre contexte disparaît, le TimerTask attendra patiemment en arrière-plan, pour finalement déclencher et potentiellement bloquer votre application car son activité était terminée. Ou bien, il peut conserver des références à votre activité après sa fermeture, ce qui l'empêche d'être collecté et de potentiellement rendre votre application à court de mémoire.

À la place, utilisez postDelayed(), qui annulera automatiquement la tâche lorsque l'activité est arrêtée.

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); 

Par ailleurs, si vous avez besoin d'annuler votre tâche manuellement, vous pouvez utiliser removeCallbacks(r) où r est le runnable vous tition.

+0

Ce code entraînera une fuite de mémoire –

4

J'ai obtenu la réponse ci-dessous selon le code:

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

S'il vous plaît juste 'postDelayed() 'sur n'importe quelle' View'. Pas de "Timer", pas de "TimerTask", pas de thread supplémentaire, et pas besoin de "Handler". – CommonsWare

+0

@CommonsWare Et si vous avez besoin d'une minuterie répétée ?? – StarDust

+1

@StarDust: Appelez 'postDelayed()' à nouveau, dans le cadre du travail effectué par le 'Runnable' que vous avez programmé avec le premier' postDelayed() ': https://github.com/commonsguy/cw-omnibus/tree/ master/Threads/PostDelayed – CommonsWare

Questions connexes