2011-03-28 398 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