每分钟更新TextView的最佳方式

时间:2011-03-28 09:42:33

标签: android user-interface clock

我的问题类似于How to update a widget every minute,但我只想更新UI的TextView。我需要访问时间,所以不幸的是不能简单地使用DigitalClock视图。

我一直在研究,并且已经找到了每分钟更新的方法,但不是一分钟,所以它们与系统时钟同步(因此它们可能会在59秒内不同步!)

我能想到的唯一方法是 (a)每秒运行一个处理程序(或计时器)(如果我只想每分钟更新,这看起来有点像矫枉过正)Like this from the android.com resources

(b)让服务在后台运行。 (我并不热衷于此,因为我已经在后台运行了更重要的事情)

(c)使用闹钟管理器(再次看起来有点矫枉过正)

似乎很容易做到,但是......

任何建议表示赞赏 梅尔

4 个答案:

答案 0 :(得分:39)

接受的答案没有特别回答这个问题。 OP要求某种方式接收某种准时(在系统时钟分钟和00秒)。

使用计时器不是正确的方法。这不仅是矫枉过正,而且你必须采取一些技巧才能做到正确。

正确的方法(即更新显示时间为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);
}

系统将根据系统时钟在每分钟的确切开始时发送此广播事件。不要忘记事先初始化TextView(到当前系统时间),因为很可能你会在一分钟内弹出你的UI,并且TextView在下一分钟发生之前不会更新。

答案 1 :(得分:0)

您可以尝试配置Timer以运行每分钟更新TextView的TimerTask(请参阅其schedule方法)。

答案 2 :(得分:0)

你试过postDelayed()

吗?

答案 3 :(得分:-1)

这就是我使用的:

int secsUntilOnTheMinute=60-Calendar.getInstance().get(Calendar.SECOND);

timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        updateSendTimesHandler.sendEmptyMessage(0);
    }
}, secsUntilOnTheMinute*1000, 60000);