Maison > Java > javaDidacticiel > le corps du texte

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

DDD
Libérer: 2024-11-05 20:11:02
original
491 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!

source:php.cn
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