2011-03-28 105 views
7

我的问题是类似于这个,How to update a widget every minute,但我只想更新UI的TextView。我需要访问时间,所以不幸的是不能简单地使用DigitalClock视图。最好的方法来更新TextView,每分钟,在分钟

我一直研究和已经找到方法来更新每一分钟,但没有对微小所以它们与系统时钟同步(因此他们可能会高达59秒的同步!)

的唯一途径(a)每秒运行一个处理程序(或计时器)(如果我只想每分钟更新一次,似乎有点过分)Like this from the android.com resources

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

(三)使用报警管理器(又似乎有点小题大做)

似乎是一件容易的事,可是......

任何意见赞赏 梅尔

回答

0

你可以尝试配置Timer运行TimerTask是每分钟更新(见其schedule法)你的TextView。

+0

三江源,这种想法的工作。我得到了当前的日期,减去秒和毫秒,所以这是一个四舍五入的分钟。然后,我加了一整分钟,以便开始。最后,我把它设置为每分钟更新一次(60 000毫秒)的定时器。 – Mel 2011-03-31 00:00:25

+1

如果有人感兴趣,下面是一些代码。 Steve Ody编写的代码(http://steve.odyfamily.com/?p=12)非常有用。 'code'myTimer = new Timer(); GregorianCalendar calCreationDate = new GregorianCalendar(); int intMilli = calCreationDate.get(Calendar.MILLISECOND); int intSeconds = calCreationDate.get(Calendar.SECOND); calCreationDate.add(Calendar.MILLISECOND,(-1 * intMilli)); calCreationDate.add(Calendar.SECOND,-1 * intSeconds); calCreationDate.add(Calendar.MINUTE,1);日期dateStartDate = calCreationDate.getTime(); 'code' – Mel 2011-03-31 00:03:15

+0

Android工作中的计时器,但它们不是首选的方式。使用处理程序而不是定时器! – Zordid 2013-06-04 07:58:11

0

你试过postDelayed()

+0

Thankyou为您的重播。尽管在android.com上的文章推荐了处理程序,但Steve Ody的文章让我有些失望! – Mel 2011-03-31 00:07:08

38

接受的答案并没有具体回答这个问题。 OP要求一种方法来接收某种事件准时(在系统时钟分00秒)。

使用计时器不是正确的方法。这不仅是矫枉过正,但你必须采取一些技巧,使其正确。

做到这一点(即更新显示的时间为HH一个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(到当前系统时间),因为它很可能会在一分钟之内弹出您的用户界面,并且在下一分钟发生之前TextView不会更新。

+0

你的代码工作得很好!谢谢..如何更新每秒的时间? – Rash 2013-01-21 14:17:27

+1

不幸的是ACTION_TIME_TICK在一分钟内被修复。如果我需要一个TextView以秒来显示当前时间,我想我会使用单独的TextView来处理秒,并用一个简单的Timer来处理它(由BroadCastReceiver每分钟重新分配一次以避免长时间运行偏差)。关于不使用定时器的一点是,基本上,你想看到实时的分钟变化。秒数通常不会成为一个问题,如果稍微关闭,但每分钟重新同步应该永远执行这个技巧。 – Alex 2013-01-24 22:14:49

+0

男人的工作完美,首先我已经在onCreate中设置日期,然后在每一分钟它从broadcastReciever更新。 – 2015-04-14 19:25:45

-1

这是我使用的:

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

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

请添加说明,而不是仅发布代码。 – 2014-07-14 20:12:05

+0

你不应该使用TimerTask,因为它不可靠。有关详情,请参阅:https://guides.codepath.com/android/Repeating-Periodic-Tasks – jpact 2017-02-12 13:45:54