Android Wear:非常奇怪的等待周期

2020年5月22日 34点热度 0条评论

我希望智能手表每小时振动一次,所以我为发生振动的功能创建了一个警报。
由于Android经常在几秒钟后调用警报功能,因此我将其解决:

      final Thread t = new Thread()
      {
        @Override
        public void run()
        {
          Calendar cal = Calendar.getInstance();

          try
          {
            Log.d(PROGRAM, "Waiting until next full minute");
            cal.setTimeInMillis(getCurrentTimeMillis());
            while(cal.get(Calendar.SECOND) >= (60 - (HOURY_CHIME_CORRECTION / 1000)))
            {
              TimeUnit.SECONDS.sleep(1);
              cal.setTimeInMillis(getCurrentTimeMillis());
            }
            hourlyChime();
          }
          catch(Exception e)
          {
            Log.i(PROGRAM, "Exception:\n" + e);
          }

          alarmManager.cancel(hourlyChimePendingIntent);
          alarmManager.setExact(
                  AlarmManager.RTC_WAKEUP,
                  getNextHourMS(),
                  hourlyChimePendingIntent);
        }
      };
      t.start();

当前HOURLY_CHIME_CORRECTION是10秒,并且闹钟已设置为整小时前10秒(HOURLY_CHIME_CORRECTION)。

现在的问题是:我发现通过ADB,该函数将被正确调用(+/-几秒钟,如预期的那样),并开始等待周期。

通常它可以正常工作,但有时(随机!),该循环被阻止,并且即使我打开显示器,该循环仍会继续...

正如我所说,这种行为是不可复制的(或至少并非总是如此)。有时有效,有时无效...

有一个想法,可能是什么问题?

谢谢

路卡

解决方案如下:

我有一个“解决方案”。
由于我无法在线程中等待,因此请确保系统不会取消该线程,并且由于没有线程等待会阻塞显示更新,因此我编写了两个不同的等待周期:线程中的第一个等待周期,如果显示打开则运行,如果没有显示,则另一个没有Thread的线程将运行。

当然问题是,如果在第二个等待周期中显示继续进行,则什么也不会显示。

我试图在等待周期内强制刷新显示,但没有使它正常工作。调用invalidate()不起作用...将不进行任何显示更新。
我想,invalidate()只是说系统“您可以尽快重绘视图”,但是只要程序处于等待周期,系统就不会重绘...
也许有人知道在for循环中重绘表面的系统?当然,这将是正确的解决方案...

问候
路卡