首頁 > Java > java教程 > 主體

如何在Android中使用執行緒實作倒數計時器?

DDD
發布: 2024-11-05 20:11:02
原創
444 人瀏覽過

How to Implement a Countdown Timer in Android Using Threads?

Android 中的計時器執行緒:綜合指南

問題:
用於建立計時器執行緒的Java 程式碼區塊Android 中的倒數計時器執行緒出現故障。目標是建立一個從 5 分鐘倒數到 0:00 的計時器,更新 TextView 上的時間顯示。

解:

1 。 UI執行緒更新限制:
UI執行緒以外的執行緒不能直接更新使用者介面。在這種情況下,執行緒試圖從後台執行緒修改 TextView,這是不允許的。

2.推薦方法:

  • CountDownTimer: Android 提供了一個方便的倒數計時類,它自動處理 UI 更新。
  • Handler: 安排任務以特定的時間間隔執行,並提供一種從後台執行緒執行 UI 更新的方法。
  • 計時器: 允許在單獨的執行緒上排程任務,但明確要求執行緒同步更新 UI 元素。

3.替代實作範例:

a。倒數計時器

<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>
登入後複製

b.處理程序

<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>
登入後複製

c.定時器

<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>
登入後複製
c.定時器

以上是如何在Android中使用執行緒實作倒數計時器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!