175 votes

Comment définir un minuteur dans Android

Quelle est la bonne façon de définir une minuterie dans Android afin de lancer une tâche (une fonction que je crée et qui ne modifie pas l'interface utilisateur) ? Utilisez cette méthode à la manière de Java : http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html

Ou existe-t-il une meilleure méthode dans Android (le gestionnaire d'Android) ?

165voto

Samuel Points 4472

Oui le timer de java peut être utilisé mais comme la question demande meilleur moyen (pour mobile). Ce qui est expliqué Ici .


Pour le bien de StackOverflow :

Depuis Minuterie crée un nouveau fil de discussion, il peut être considéré comme lourd,

si tout ce dont vous avez besoin, c'est d'être rappelé pendant que l'activité est en cours Manipulateur peut être utilisé en conjonction avec un

Runnable :

private final int interval = 1000; // 1 Second
private Handler handler = new Handler();
private Runnable runnable = new Runnable(){
    public void run() {
        Toast.makeText(MyActivity.this, "C'Mom no hands!", Toast.LENGTH_SHORT).show();
    }
};
...
handler.postAtTime(runnable, System.currentTimeMillis()+interval);
handler.postDelayed(runnable, interval);

ou un Message

private final int EVENT1 = 1; 
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {         
        case Event1:
            Toast.makeText(MyActivity.this, "Event 1", Toast.LENGTH_SHORT).show();
            break;

        default:
            Toast.makeText(MyActivity.this, "Unhandled", Toast.LENGTH_SHORT).show();
            break;
        }
    }
};

...

Message msg = handler.obtainMessage(EVENT1);
handler.sendMessageAtTime(msg, System.currentTimeMillis()+interval);
handler.sendMessageDelayed(msg, interval);

En passant, cette approche peut être utilisée si vous voulez exécuter un morceau de code dans le thread de l'interface utilisateur à partir d'un autre thread.

si vous avez besoin d'être rappelé même si votre activité n'est pas en cours, vous pouvez utiliser une fonction AlarmManager

1 votes

J'ai mis à jour le lien, en parlant de google qui a du mal à maintenir les liens.

1 votes

Cet article date de 2007 - je ne dis pas qu'il est faux, mais je me méfie toujours d'un article sur les mobiles s'il date de plus de trois ans. Les choses changent très vite.

0 votes

@StackOverflowed, Vous n'avez rien compris mon pote ! Un fil est toujours plus épais qu'un manipulateur. En résumé, cela dépend du poids de la tâche que vous voulez soulever et non de l'âge du fil ;)

146voto

MannyNS Points 3510

Méthode standard de Java pour utiliser les minuteries via java.util.Timer et java.util.TimerTask fonctionne bien sous Android, mais vous devez savoir que cette méthode crée un nouveau fil de discussion.

Vous pouvez envisager d'utiliser le très pratique Manipulateur (Android.os.Handler) et envoyer des messages au gestionnaire par l'intermédiaire de sendMessageAtTime(android.os.Message, long) ou sendMessageDelayed(android.os.Message, long) . Dès que vous recevez un message, vous pouvez exécuter les tâches souhaitées. La deuxième option consiste à créer un Runnable et le programmer via les fonctions du Handler postAtTime(java.lang.Runnable, long) ou postDelayed(java.lang.Runnable, long) .

10 votes

C'est la mauvaise façon de faire les choses dans Android. Dans Android, vous devez utiliser le gestionnaire d'alarmes ( developer.Android.com/reference/Android/app/AlarmManager.html ) pour exécuter des tâches dans un avenir lointain.

9 votes

@Kurtis Nusbaum La question ne dit pas à combien de temps dans le futur se situe la tâche.

0 votes

@Scienceprodigy Et ? L'utilisation du AlarmManager reste la chose la plus appropriée à faire dans ce cas. La distance dans laquelle se trouve la tâche n'a rien à voir avec cela.

134voto

MrThys Points 1827

Comme je l'ai vu, java.util.Timer est le plus utilisé pour mettre en œuvre une minuterie.

Pour une tâche répétitive :

new Timer().scheduleAtFixedRate(task, after, interval);

Pour une seule exécution d'une tâche :

new Timer().schedule(task, after);

tâche étant la méthode à exécuter
après le temps de l'exécution initiale
( intervalle le temps de répétition de l'exécution)

11 votes

Je vais juste ajouter que le temps est en millisecondes.

2 votes

Documents de développement Android pour scheduleAtFixedRate

1 votes

task peut être une instance de votre classe qui hérite de java.util.TimerTask et remplace void run() .

11voto

Elle est situationnelle.

La documentation d'Android suggère d'utiliser AlarmManager pour enregistrer un Intent qui se déclenchera à l'heure spécifiée si votre application n'est pas en cours d'exécution.

Sinon, vous devez utiliser Handler.

Remarque : Le gestionnaire d'alarme est destiné pour les cas où vous souhaitez que votre code d'application s'exécute à un moment spécifique, même si votre application n'est pas en cours d'exécution. Pour une synchronisation normale normales (ticks, timeouts, etc), il est il est plus facile et beaucoup plus efficace d'utiliser d'utiliser Handler.

11voto

Rizwan Sohaib Points 729

C'est parti... Nous aurons besoin de deux classes. J'affiche un code qui change le profil audio du mobile après chaque 5 secondes (5000 millisecondes) ...

Notre 1ère classe

public class ChangeProfileActivityMain extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        Timer timer = new Timer();
        TimerTask updateProfile = new CustomTimerTask(ChangeProfileActivityMain.this);
        timer.scheduleAtFixedRate(updateProfile, 0, 5000);
    }

}

Notre 2ème classe

public class CustomTimerTask extends TimerTask {

    private AudioManager audioManager;
    private Context context;
    private Handler mHandler = new Handler();

    // Write Custom Constructor to pass Context
    public CustomTimerTask(Context con) {
        this.context = con;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

        // your code starts here.
        // I have used Thread and Handler as we can not show Toast without starting new thread when we are inside a thread.
        // As TimePicker has run() thread running., So We must show Toast through Handler.post in a new Thread. Thats how it works in Android..
        new Thread(new Runnable() {
            @Override
            public void run() {
                audioManager = (AudioManager) context.getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        if(audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {
                            audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                            Toast.makeText(context, "Ringer Mode set to Normal", Toast.LENGTH_SHORT).show();
                        } else {
                            audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
                            Toast.makeText(context, "Ringer Mode set to Silent", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
            }
        }).start();

    }

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X