2013-03-10 36 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()调用。

相关问题