定期更新小部件 TextView 的简单方法
Posted
技术标签:
【中文标题】定期更新小部件 TextView 的简单方法【英文标题】:Simple way To Update Widget TextView Periodically 【发布时间】:2013-02-25 09:22:48 【问题描述】:我有一个带有两个 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】:您可以创建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()
中,您可以进行所有的 UI 更新。我想所有这些都发生在 Activity
内部,并带有适当的 onPause()/onResume()
调用。
【讨论】:
什么Activity
?没有Activity
,因为这是Widget
。【参考方案2】:
你必须使用AlarmManager,查看本教程了解详情:http://www.vogella.com/articles/androidWidgets/article.html#widget_update不要忘记查看这部分:
8.教程:通过服务更新小部件
【讨论】:
那不相关他们的服务与定期更新无关。【参考方案3】:另一种可能性是使用Timer 和TimerTask 类。
您可以使用Timer.schedule(TimerTask task, long delay, long period)
方法来完成您需要的工作。
请记住,您无法从 TimerTask 中访问 UI 线程 - 因此,如果您已经打算将 Handler
与 Timer
类一起使用,Handler.postDelayed()
方法可能是更好的选择。 还有其他方法可以使用 TimerTask
访问 UI 线程,例如 Activity.runOnUiThread()
。
【讨论】:
我可能是错的,但如果你使用TimerTask
,你可能会在更新你的 UI 时遇到麻烦,因为 UI 更新应该在 UI 线程上完成,而TimerTask
在它自己的运行线程。
是的,你是对的。您必须使用 runOnUiThread()
或 Handler
来更新 UI 线程。我会说使用Timer
方法而不是Handler.postDelayed()
方法是一个偏好问题——在写我的答案时,唯一的其他建议答案是AlarmManager
方法。当然,如果您打算使用Handler
在UI 线程上进行更新,那么从一开始就使用Handler.postDelayed()
方法可能更有意义。我将对我的答案进行编辑,并将其作为另一种可能的选择。
我之前尝试过但失败的任何 id 放在哪里的例子..
你把这个Timer
放在哪里以及如何开始?以上是关于定期更新小部件 TextView 的简单方法的主要内容,如果未能解决你的问题,请参考以下文章
小部件上的 TextView 未使用 OnUpdate 方法更新