2013-03-10 60 views
2

我有一個小部件與兩個TextView顯示時間和日期。簡單的方法來更新小部件TextView定期

我只是希望這批代碼發生每秒:

views.setOnClickPendingIntent(R.id.rl, pendingIntent); 
java.util.Date noteTS = Calendar.getInstance().getTime(); 
String time = "kk:mm"; 
String date = "dd MMMMM yyyy"; 

views.setTextViewText(R.id.tvTime, DateFormat.format(time, noteTS)); 
views.setTextViewText(R.id.tvDate, DateFormat.format(date, noteTS)); 

所以我需要一個簡單的方法,在小部件定期更新的TextView所以時間比標準的30分鐘改變了。由於

回答

1

另一種可能性是使用的TimerTimerTask類。 你可以使用Timer.schedule(TimerTask task, long delay, long period)方法來完成你所需要的。

請記住,你不能一個TimerTask內訪問UI線程 - 所以如果你已經打算使用HandlerTimerHandler.postDelayed()方法可能是一個更好的選擇。有用於訪問UI線程的其他方法,如TimerTask,如Activity.runOnUiThread()

+1

我可能是錯的,但如果你使用'TimerTask',你可能會遇到更新UI的麻煩,因爲UI更新應該在UI線程上完成,'TimerTask'運行在它自己的線程中。 – lenik 2013-03-10 01:50:44

+0

是的,你是對的。你必須使用'runOnUiThread()'或者'Handler'來更新UI線程。我會說'Timer'方法在'Handler.postDelayed()'方法上的使用是一個偏好問題 - 在我寫答案的時候,唯一另外提出的答案是'AlarmManager'方法。當然,如果您打算在UI線程上使用'Handler'來更新,那麼從一開始就使用'Handler.postDelayed()'方法可能更有意義。我會對我的答案進行編輯,並將其作爲另一種可能的替代方案。 – 2013-03-10 02:02:10

+0

任何機會的地方,因爲我已經嘗試過這之前,失敗.. – Timmo 2013-03-10 11:48:40

7

您可以創建HandlerRunnable,然後讓Handler以指定的時間間隔重新啓動Runnable。你的程序可能看起來像這樣:

private Handler mHandler = new Handler(); 

@Override 
public void onResume() { 
    super.onResume(); 
    mHandler.removeCallbacks(mUpdateClockTask); 
    mHandler.postDelayed(mUpdateCLockTask, 100); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    mHandler.removeCallbacks(mUpdateClockTask); 
} 

private Runnable mUpdateClockTask = new Runnable() { 
    public void run() { 
     updateClock(); 
     mHandler.postDelayed(mUpdateClockTask, 1000); 
    } 
}; 

and inside updateClock()你做所有的UI更新。我想這一切都發生在Activity內部,並且有合適的onPause()/onResume()調用。

相關問題