我希望我的智能 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/