2013-03-10 4 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

Другой возможностью было бы использование классов Timer и TimerTask. Вы можете использовать метод Timer.schedule(TimerTask task, long delay, long period), чтобы выполнить то, что вам нужно.

Имейте в виду, что вы не можете получить доступ нить UI изнутри TimerTask - поэтому метод Handler.postDelayed() может быть лучшим выбором, если вы уже собираетесь использовать Handler с Timer класса. Там являются другими способами доступа к потоку пользовательского интерфейса с TimerTask, например Activity.runOnUiThread().

+1

Возможно, вы ошибаетесь, но если вы используете 'TimerTask', у вас могут возникнуть проблемы с обновлением пользовательского интерфейса, поскольку обновление пользовательского интерфейса должно выполняться в потоке пользовательского интерфейса, а' TimerTask' запускается в своем потоке. – lenik

+0

Да, вы правы. Вам нужно будет использовать 'runOnUiThread()' или 'Handler' для обновления в потоке пользовательского интерфейса. Я бы сказал, что использование метода «Таймер» по методу «Handler.postDelayed()» является вопросом предпочтения - во время написания моего ответа единственным другим предложенным ответом был метод «AlarmManager». Разумеется, если вы планируете использовать обработчик «Handler» для обновления в потоке пользовательского интерфейса, возможно, имеет смысл использовать метод «Handler.postDelayed()» с самого начала. Я сделаю редактирование своего ответа и оставлю его в качестве другой возможной альтернативы. –

+0

Любые шансы на пример, где id положил это, поскольку я пробовал это раньше и не смог. – Timmo

7

вы можете создать Handler и Runnable, а затем дайте 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); 
    } 
}; 

и внутри updateClock() вы делаете все ваши обновления пользовательского интерфейса. Я предполагаю, что все это происходит внутри Activity с соответствующими вызовами onPause()/onResume().

Смежные вопросы