【问题标题】:Simple way To Update Widget TextView Periodically定期更新小部件 TextView 的简单方法
【发布时间】:2025-12-07 02:25:02
【问题描述】:

我有一个带有两个 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 分钟。谢谢

【问题讨论】:

    标签: android android-widget widget textview


    【解决方案1】:

    您可以创建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);
        }
    };
    

    updateClock() 中,您可以进行所有的 UI 更新。我想所有这些都发生在 Activity 内部,并带有适当的 onPause()/onResume() 调用。

    【讨论】:

    • 什么Activity?没有Activity,因为这是Widget
    【解决方案2】:

    你必须使用AlarmManager,查看本教程了解详情:http://www.vogella.com/articles/AndroidWidgets/article.html#widget_update不要忘记查看这部分:

    8.教程:通过服务更新小部件

    【讨论】:

    • 那不相关他们的服务与定期更新无关。
    【解决方案3】:

    另一种可能性是使用TimerTimerTask 类。 您可以使用Timer.schedule(TimerTask task, long delay, long period) 方法来完成您需要的工作。

    请记住,您无法从 TimerTask 中访问 UI 线程 - 因此,如果您已经打算将 HandlerTimer 类一起使用,Handler.postDelayed() 方法可能是更好的选择。 还有其他方法可以使用 TimerTask 访问 UI 线程,例如 Activity.runOnUiThread()

    【讨论】:

    • 我可能是错的,但如果你使用TimerTask,你可能会在更新你的 UI 时遇到麻烦,因为 UI 更新应该在 UI 线程上完成,而TimerTask 在它自己的运行线程。
    • 是的,你是对的。您必须使用 runOnUiThread()Handler 来更新 UI 线程。我会说使用Timer 方法而不是Handler.postDelayed() 方法是一个偏好问题——在写我的答案时,唯一的其他建议答案是AlarmManager 方法。当然,如果您打算使用Handler 在UI 线程上进行更新,那么从一开始就使用Handler.postDelayed() 方法可能更有意义。我将对我的答案进行编辑,并将其作为另一种可能的选择。
    • 我之前尝试过但失败的任何 id 放在哪里的例子..
    • 你把这个Timer放在哪里以及如何开始?
    最近更新 更多