web-dev-qa-db-fra.com

Créer un temporisateur d'intervalle en Java android

J'ai l'intention de créer une application d'intervalle à l'aide de minuteries. Ce devrait être le plus basique. Je vais donc devoir en ajouter un peu plus après avoir compris les bases. Ce que je veux réaliser, c'est sélectionner le nombre de minutes qu'un intervalle devrait durer, mais combien de fois cet intervalle devrait durer. Comme un intervalle qui dure 1 minute et dure 8 fois. La question est quelle est la meilleure minuterie à utiliser? Je me suis essayé sur le Android Compte à rebours et cela semble fonctionner. Mais y en a-t-il un autre qui est mieux?

16
Hans Fredrik

Je recommanderais toujours d'utiliser un Handler.

C'est un peu plus de travail que les classes intégrées, mais je trouve qu'il est beaucoup plus efficace et que vous avez plus de contrôle sur lui.

Le gestionnaire est une classe qui gérera l'exécution de code sur un Looper/Thread par défaut, le thread dans lequel il est créé, sinon vous pouvez spécifier où le gestionnaire exécute son code en passant le Looper au constructeur Handler comme - new Handler(Looper.getMainLooper());

La raison pour laquelle je recommanderais le looper est parce que vous avez une plus grande flexibilité de contrôle, car c'est une abstraction légèrement plus basse que les méthodes TimerTask.

Généralement, ils sont très utiles pour exécuter du code sur des threads. Par exemple. utile pour canaliser les données sur les threads.

Les deux utilisations principales sont:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    final Handler h = new Handler();
    h.postDelayed(new Runnable()
    {
        private long time = 0;

        @Override
        public void run()
        {
            // do stuff then
            // can call h again after work!
            time += 1000;
            Log.d("TimerExample", "Going for... " + time);
            h.postDelayed(this, 1000);
        }
    }, 1000); // 1 second delay (takes millis)
}

Utilisation simple!

Ou vous pouvez utiliser des messages, ce qui réduit la création d'objets. Si vous songez à une mise à jour rapide de l'interface utilisateur, etc., cela réduira la pression sur le garbage collector.

class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        MyTimers timer = new MyTimers();
        timer.sendEmptyMessage(MyTimers.TIMER_1);
        timer.sendEmptyMessage(MyTimers.TIMER_2);

    }


    public static class MyTimers extends Handler
    {

        public static final int TIMER_1 = 0;
        public static final int TIMER_2 = 1;

        @Override
        public void handleMessage(Message msg)
        {
            switch (msg.what)
            {
                case TIMER_1:
                    // Do something etc.
                    Log.d("TimerExample", "Timer 1");
                    sendEmptyMessageDelayed(TIMER_1, 1000);
                    break;
                case TIMER_2:
                    // Do another time update etc..
                    Log.d("TimerExample", "Timer 2");
                    sendEmptyMessageDelayed(TIMER_2, 1000);
                    break;
                default:
                    removeMessages(TIMER_1);
                    removeMessages(TIMER_2);
                    break;
            }
        }
    }
}

Évidemment, c'est pas une implémentation complète mais cela devrait vous donner une longueur d'avance.

49
Chris.Jenkins