首页 >Java >java教程 >如何在Android中使用线程实现倒计时器?

如何在Android中使用线程实现倒计时器?

DDD
DDD原创
2024-11-05 20:11:02497浏览

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>

以上是如何在Android中使用线程实现倒计时器?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn