Maison > Java > javaDidacticiel > Comment implémenter un compte à rebours dans Android à l'aide de Threads ?

Comment implémenter un compte à rebours dans Android à l'aide de Threads ?

DDD
Libérer: 2024-11-05 20:11:02
original
608 Les gens l'ont consulté

How to Implement a Countdown Timer in Android Using Threads?

Timer Thread dans Android : un guide complet

Problème :
Un bloc de code Java pour créer un Le fil du compte à rebours dans Android fonctionne mal. L'objectif est de créer un compte à rebours de 5 minutes à 0h00, mettant à jour l'affichage de l'heure sur un TextView.

Solution :

1 . Restriction de mise à jour du fil de l'interface utilisateur :
Les fils de discussion autres que le fil de l'interface utilisateur ne peuvent pas mettre à jour directement l'interface utilisateur. Dans ce cas, le fil tente de modifier TextView à partir du fil d'arrière-plan, ce qui n'est pas autorisé.

2. Approches recommandées :

  • CountDownTimer : Android fournit une classe pratique pour les comptes à rebours, qui gère automatiquement les mises à jour de l'interface utilisateur.
  • Gestionnaire : Planifie une tâche à exécuter à des intervalles spécifiques et fournit un moyen d'effectuer des mises à jour de l'interface utilisateur à partir d'un thread en arrière-plan.
  • Timer : Permet de planifier des tâches sur un thread distinct, mais nécessite explicitement la synchronisation des threads. pour mettre à jour les éléments de l'interface utilisateur.

3. Exemples de mise en œuvre alternatifs :

a. Compte à rebours

<code class="java">public class MainActivity extends Activity {

    Button b;
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.textView1);
        b = (Button) findViewById(R.id.button1);

        b.setOnClickListener(v -> startTimer(120000)); // start countdown for 2 minutes
    }

    private void startTimer(long time) {
        CountDownTimer counter = new CountDownTimer(time, 1000){
            public void onTick(long millisUntilDone) {
                tv.setText("You have " + millisUntilDone + "ms");
            }

            public void onFinish() {
                tv.setText("DONE!");
            }
        }.start();
    }
}</code>
Copier après la connexion

b. Gestionnaire

<code class="java">Handler m_handler;
Runnable m_handlerTask;
int timeLeft = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    m_handler = new Handler();
    m_handlerTask = () -> {
        if (timeLeft >= 0) {
            Log.i("timeleft", "" + timeLeft);
            timeLeft--;
        } else {
            m_handler.removeCallbacks(m_handlerTask); // cancel run
        }
        m_handler.postDelayed(m_handlerTask, 1000);
    };
    m_handlerTask.run();
}</code>
Copier après la connexion

c. Minuterie

<code class="java">int timeLeft = 100;
Timer _t = new Timer();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    _t.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(() -> {
                Log.i("timeleft", "" + timeLeft);
                // update UI elements here
            });
            if (timeLeft > 0) {
                timeLeft--;
            } else {
                _t.cancel();
            }
        }
    }, 1000, 1000);
}</code>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal