Ric*_*out 17 android timer clock
有一个我想在TextView中显示的时钟.
我原本以为有一些很好的功能可以做到这一点,但我找不到任何东西.我最终实现了自己使用Handler的方式.我问的是,是否有更好(更有效)的方式来显示实时更新时钟?
private Runnable mUpdateClockTask = new Runnable() {
public void run() {
setTime();
mClockHandler.postDelayed(this, 1000);
}
};
Run Code Online (Sandbox Code Playgroud)
这是我的处理程序,它每秒运行一次,然后我的设置时间和日期功能在下面
TextView mClockView;
public void setTime() {
Calendar cal = Calendar.getInstance();
int minutes = cal.get(Calendar.MINUTE);
if (DateFormat.is24HourFormat(this)) {
int hours = cal.get(Calendar.HOUR_OF_DAY);
mClockView.setText((hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes));
}
else {
int hours = cal.get(Calendar.HOUR);
mClockView.setText(hours + ":" + (minutes < 10 ? "0" + minutes : minutes) + " " + new DateFormatSymbols().getAmPmStrings()[cal.get(Calendar.AM_PM)]);
}
}
Run Code Online (Sandbox Code Playgroud)
干杯
Ale*_*lex 40
更新系统时钟与更新计时器不同.我们谈论在分钟上改变的时间(系统时钟分钟和00秒).
使用Timer不是正确的方法.这不仅是矫枉过正,而且你必须采取一些技巧才能做到正确.
正确的方法(即更新显示时间为HH:mm的TextView)是使用BroadcastReceiver,如下所示:
BroadcastReceiver _broadcastReceiver;
private final SimpleDateFormat _sdfWatchTime = new SimpleDateFormat("HH:mm");
private TextView _tvTime;
@Override
public void onStart() {
super.onStart();
_broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context ctx, Intent intent) {
if (intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0)
_tvTime.setText(_sdfWatchTime.format(new Date()));
}
};
registerReceiver(_broadcastReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
}
@Override
public void onStop() {
super.onStop();
if (_broadcastReceiver != null)
unregisterReceiver(_broadcastReceiver);
}
Run Code Online (Sandbox Code Playgroud)
系统将根据系统时钟在每分钟的确切开始时发送此广播事件.不要忘记事先初始化TextView(到当前系统时间),因为很可能你会在一分钟内弹出你的UI,并且TextView在下一分钟发生之前不会更新.
Joe*_*ill 15
查看Chronometer和DigitalClock类,它们是TextView类的扩展.他们应该自动做你想要的.如果您需要一些额外的功能,只需查看这些功能的源代码并进行所需的任何更改.
更新:
由于数字时钟在API 17中已弃用,我建议使用文本时钟代替.
小智 8
我推荐TextClock(来自 API 17),也请不要使用 DigitalClock(从 API 17 弃用),因为它会导致内存泄漏并导致内存不足异常。请在对应的layout.xml文件中添加以下代码
<TextClock
android:id="@+id/textClock1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:textColor="#17d409" />
Run Code Online (Sandbox Code Playgroud)
这可以解决问题,还请注意,您可以根据需要格式化显示时间,例如以秒为单位的 12 小时格式,您可以使用“android:format12Hour="hh:mm:ss a"”。
请记住:过早的优化是万恶之源。因此,只有当您确定(=已经测量过)您的实施速度缓慢/效率低下时才进行优化。
也就是说,更有效的方法可能是通过记录开始时间System.currentTimeMillis(),然后定期检查并计算以分钟为单位的差异。
| 归档时间: |
|
| 查看次数: |
46983 次 |
| 最近记录: |