Maison >Java >javaDidacticiel >Comment mettre à jour en toute sécurité l'interface utilisateur à partir d'un fil de discussion dans Android Timer ?

Comment mettre à jour en toute sécurité l'interface utilisateur à partir d'un fil de discussion dans Android Timer ?

DDD
DDDoriginal
2024-11-27 12:37:14899parcourir

How to Safely Update the UI from a Thread in Android Timer?

Thème Android pour une minuterie

Problème

Le code fourni crée une minuterie qui compte à rebours de 5 minutes à 0 :00, mais cela ne fonctionne pas comme prévu. Le problème réside dans la mise à jour de l'interface utilisateur à partir d'un thread autre que le thread de l'interface utilisateur.

Solution

Lorsque vous travaillez avec des threads sous Android, il est essentiel d'éviter de mettre à jour l'interface utilisateur à partir de threads non-UI. . Voici trois approches alternatives pour créer un compte à rebours tout en garantissant que les mises à jour de l'interface utilisateur sont effectuées sur le fil de l'interface utilisateur :

1. Compte à rebours

Exemple :

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

    private TextView timer1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        timer1 = findViewById(R.id.timer1);
        startTimer(5 * 60 * 1000);  // 5 minutes in milliseconds
    }

    private void startTimer(long time) {
        CountDownTimer timer = new CountDownTimer(time, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                int minutes = (int) (millisUntilFinished / (1000 * 60));
                int seconds = (int) (millisUntilFinished / 1000) % 60;
                timer1.setText(String.format("%02d:%02d", minutes, seconds));
            }

            @Override
            public void onFinish() {
                timer1.setText("00:00");
            }
        };
        timer.start();
    }
}</code>

2. Gestionnaire

Exemple :

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

    private Handler mHandler;
    private Runnable mRunnable;
    private int timeleft = 5 * 60;  // 5 minutes

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mHandler = new Handler();
        mRunnable = new Runnable() {
            @Override
            public void run() {
                if (timeleft >= 0) {
                    int minutes = timeleft / 60;
                    int seconds = timeleft % 60;
                    timer1.setText(String.format("%02d:%02d", minutes, seconds));
                    timeleft--;
                } else {
                    // Stop the timer
                    mHandler.removeCallbacks(mRunnable);
                }
                mHandler.postDelayed(mRunnable, 1000);
            }
        };
        mRunnable.run();
    }
}</code>

3. Minuterie

Exemple :

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

    private Timer timer;
    private TimerTask timerTask;
    private int timeleft = 5 * 60;  // 5 minutes

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        timer = new Timer();
        timerTask = new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (timeleft >= 0) {
                            int minutes = timeleft / 60;
                            int seconds = timeleft % 60;
                            timer1.setText(String.format("%02d:%02d", minutes, seconds));
                            timeleft--;
                        } else {
                            // Cancel the timer
                            timer.cancel();
                        }
                    }
                });
            }
        };
        timer.scheduleAtFixedRate(timerTask, 1000, 1000);
    }
}</code>

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:
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