现在我正在尝试创建一个在 boolean flag1 == true 时增加音量的函数。所以我想做的是增加音量(我可以做到这一点),等待并且不执行任何操作(“nop”),然后再次检查标志。
我尝试使用 Thread.sleep() 进行 while 循环,但它的行为有点不可靠。请记住,我是从可能已启动多次的服务中调用此函数,因此检查标志很重要。
这是我尝试过的示例:
private void cycleVolume() {
while (flag1 == true) {
mAudioManager.adjustVolume(AudioManager.ADJUST_RAISE, AudioManager.FLAG_PLAY_SOUND);
try {
Thread.sleep(750);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
flag1 从 BroadcastReceiver 事件中变为 false,这应该会停止执行此函数。然而,在测试中,我注意到这种情况在应该发生的相当长一段时间内都不会发生,并且因为在我猜测那里存在问题之前我从未对线程做过太多工作。
那么我应该做什么呢?
谢谢。
最佳答案
我不确定您是否以正确的方式处理此问题,但以下是修复当前代码的方法。
1)使您的标志变量可变。
2) 为该标志提供同步的 getter 和 setter 方法。
该问题是由 Java 的内存模型引起的。由于您有 2 个线程访问同一字段,因此您需要提供一种方法来同步它们的访问。现在,两个线程可能看不到彼此对共享字段的更改。对于简单的 boolean 值,使用 volatile 可能更有效。
关于java - Android - 执行任务,等待,什么都不做,然后再次执行任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6462249/