在Android编程中,计时器是一个常见的功能,通常用于倒计时、秒表或定时任务,以下是两种实现计时器的常用方法:使用Chronometer控件和TimerTask结合Handler。
一、使用Chronometer控件
1. Chronometer控件简介
Chronometer是Android提供的一个简单计时器组件,继承自TextView,它显示从某个起始时间开始经过的时间,但不显示当前时间。
2. 主要XML属性
android:countDown
:是否倒计时,默认false。
android:format
:设置显示时间格式,如果指定,第一个"%s"替换为"MM:SS"或"H:MM:SS"形式的当前计时器值。
setBase(long)
:设置计时器起始时间。
start()
:开始计时。
stop()
:停止计时。
updateText(long)
:更新界面显示的文本。
dispatchChronometerTick()
:触发监听事件。
3. 示例代码
<!-res/layout/activity_main.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btnStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start"/> <Button android:id="@+id/btnStop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Stop"/> <Chronometer android:id="@+id/chronometer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:format="00:00:00"/> </LinearLayout>
// MainActivity.java package com.example.timerdemo; import android.os.Bundle; import android.os.SystemClock; import android.view.View; import android.widget.Button; import android.widget.Chronometer; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private Chronometer chronometer; private long baseTime = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); chronometer = findViewById(R.id.chronometer); Button btnStart = findViewById(R.id.btnStart); Button btnStop = findViewById(R.id.btnStop); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { baseTime = SystemClock.elapsedRealtime(); chronometer.setBase(baseTime); chronometer.start(); } }); btnStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { chronometer.stop(); } }); } }
二、使用TimerTask结合Handler
1. TimerTask简介
TimerTask是一个子线程,可以处理一些比较复杂耗时的功能逻辑,常与Handler结合使用,Timer是Android直接启动定时器的类。
2. 注意事项
定时器需要在onDestroy()方法中取消掉,否则可能发生崩溃。
使用TimerTask定时进行某些操作的APP,即使退出了,TimerTask中依然会执行一会。
3. 示例代码
<!-res/layout/activity_main.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btnStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start"/> <TextView android:id="@+id/tvTimer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="60sp"/> </LinearLayout>
// MainActivity.java package com.example.timerdemo; import android.os.Bundle; import android.os.Handler; import android.os.SystemClock; import android.view.View; import android.widget.Button; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends AppCompatActivity { private TextView tvTimer; private long baseTime = 0; private Timer timer; private TimerTask timerTask; private final Handler handler = new Handler(); private boolean isRunning = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvTimer = findViewById(R.id.tvTimer); Button btnStart = findViewById(R.id.btnStart); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!isRunning) { baseTime = SystemClock.elapsedRealtime(); timerTask = new TimerTask() { @Override public void run() { int time = (int) ((SystemClock.elapsedRealtime() baseTime) / 1000); String hh = String.format("%02d", time / 3600); String mm = String.format("%02d", (time % 3600) / 60); String ss = String.format("%02d", time % 60); String timeFormat = hh + ":" + mm + ":" + ss; handler.post(() -> tvTimer.setText(timeFormat)); } }; timer = new Timer(); timer.scheduleAtFixedRate(timerTask, 0, 1000); isRunning = true; } else { timer.cancel(); isRunning = false; } } }); } }
三、相关问题与解答栏目
问题1:如何在计时器中实现倒计时功能?
答:要在计时器中实现倒计时功能,可以使用Chronometer控件的setCountDown(true)
方法。
chronometer.setCountDown(true); // 设置为倒计时模式
然后设置一个目标时间,并在每次dispatchChronometerTick()
事件中更新UI。
chronometer.setBase((SystemClock.elapsedRealtime() + countdownTimeInMillis); // 设置目标时间 chronometer.start(); // 开始倒计时
在dispatchChronometerTick()
事件中,可以更新UI显示剩余时间。
问题2:如何在应用关闭时停止计时器以避免崩溃?
答:为了避免在应用关闭时计时器仍在运行导致崩溃,可以在Activity的onDestroy()
方法中取消定时器。
@Override protected void onDestroy() { super.onDestroy(); if (timer != null) { timer.cancel(); // 取消定时器任务 } }
以上就是关于“Android编程下的计时器代码”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/635587.html