Rumah >Java >javaTutorial >Bagaimana untuk Mengemas kini UI dengan Selamat daripada Thread dalam Pemasa Android?

Bagaimana untuk Mengemas kini UI dengan Selamat daripada Thread dalam Pemasa Android?

DDD
DDDasal
2024-11-27 12:37:14946semak imbas

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

Benang Android untuk Pemasa

Masalah

Kod yang disediakan mencipta pemasa yang mengira detik dari 5 minit kepada 0 :00, tetapi ia tidak berfungsi seperti yang diharapkan. Isunya terletak pada mengemas kini UI dari dalam urutan selain daripada urutan UI.

Penyelesaian

Apabila bekerja dengan urutan dalam Android, adalah penting untuk mengelak daripada mengemas kini UI daripada urutan bukan UI . Berikut ialah tiga pendekatan alternatif untuk mencipta pemasa yang mengira detik sambil memastikan kemas kini UI dilakukan pada urutan UI:

1. CountDownTimer

Contoh:

<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. Pengendali

Contoh:

<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. Pemasa

Contoh:

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

Atas ialah kandungan terperinci Bagaimana untuk Mengemas kini UI dengan Selamat daripada Thread dalam Pemasa Android?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn