使用计时器时小部件 TextView 未更新

Posted

技术标签:

【中文标题】使用计时器时小部件 TextView 未更新【英文标题】:Widget TextView not updating when using timer 【发布时间】:2013-03-21 10:31:58 【问题描述】:

我有一个 TextView 来更新小部件中的时间和日期,并尝试使用 Timer 每秒更新一次,但它不起作用:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    final int N = appWidgetIds.length;

    for (int i = 0; i < N; i++) 
        int appWidgetId = appWidgetIds[i];

        Intent clockIntent = new Intent(context, DeskClock.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, clockIntent, 0);

        final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.digitalclock);
        views.setOnClickPendingIntent(R.id.rl, pendingIntent);

        Timer timer = new Timer();
        timer.schedule(new TimerTask() 

            @Override
            public void run() 
                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));
            
        , 0, 1000);// Update text every second

        appWidgetManager.updateAppWidget(appWidgetId, views);
    

我在某个地方出错了,所以如果有人知道,请告诉我并给我正确的方法来做到这一点。提前致谢

【问题讨论】:

【参考方案1】:

尝试在 run() 中更新应用小部件

        @Override
        public void run() 
            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));
            appWidgetManager.updateAppWidget(appWidgetId, views);
        
    , 0, 1000);// Update text every second

像这样尝试这对我有用,我认为我在使用的另一个应用程序中遇到了同样的问题,而不是使用计时器和 timertask:

Handler mHandler;
Runnable continuousRunnable = new Runnable() 
        public void run() 
            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));
            appWidgetManager.updateAppWidget(appWidgetId, views);

            mHandler.postDelayed(this, 1000);
        
    ;
  mHandler.post(continuousRunnable);

【讨论】:

我猜Handler mHandler; 超出了OnUpdate 方法.. 试过了,现在甚至没有更新一次 我成功了!我只需要将timer.schedule() 更改为timer.scheduleAtFixedRate 我对计时器进行了一些研究,结果发现schedule 只运行一次,而scheduleAtFixedRate 重复。感谢@JRowan 的帮助

以上是关于使用计时器时小部件 TextView 未更新的主要内容,如果未能解决你的问题,请参考以下文章

小部件上的 TextView 未使用 OnUpdate 方法更新

颤振计时器仅更新秒小部件

如何使用来自 Activity 的数据更新小部件?

Android 文本视图计时器

添加其他功能时小部件不起作用

在底部表 GetX 库中调用 update() 时小部件不更新