java - 安卓穿戴: very strange wait cycle

标签 java android wait alarm

我希望我的智能 watch 每小时振动一次,因此我为执行振动的函数创建了一个闹钟。
由于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 看到该函数将被正确调用(+/- 几秒钟,如预期),并且它启动等待周期。
通常它可以工作,但有时(随机!)循环被阻止,只要我打开显示器它就会继续...
正如我所说,这种行为不可重现(或者至少不总是)。有时有效,有时无效...

有人知道问题出在哪里吗?

谢谢
卢卡

最佳答案

我有一个“解决方案”...一个非常拥抱的解决方案...
由于我无法在线程中等待,以确保系统不会取消线程,并且由于没有线程的等待会导致阻塞显示更新,因此我编写了两个不同的等待周期:第一个在线程中,如果显示为 则运行开,另一个没有线程,如果显示关闭则运行。

当然问题是,如果在第二个等待周期内继续显示,则不会显示任何内容...

我尝试在等待周期内强制刷新显示,但没有成功。调用 invalidate() 不起作用...不会进行任何显示更新。
我想,invalidate()只是告诉系统“尽快重绘 View ”,但只要程序处于等待周期,系统就不会重绘...
也许有人知道一个在 for 循环期间重绘表盘的系统?当然,这将是正确的解决方案......

问候 卢卡

关于java - 安卓穿戴: very strange wait cycle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62280951/

相关文章:

java - 可能导致错误的原因是什么

java - ResultSet 为包含另一个 POJO 的数组列表的 POJO

java - 如何模拟使用 SLF4J Log4J Logger 的类?

android - GCM 演示服务器向设备发送消息引发 401 错误

java - 线程等待和唤醒

java - 带有 paintComponent 的 10x10 棋盘

android - 尝试添加 android 平台时出现 ionic 错误

android - 从堆栈中删除中间 Activity

c - 如何在循环内获取字符而不在循环中停止?

java - 如何在 JFrame 运行时暂停另一个 JFrame