Android - 做任务,等待什么也不做,然后再做一次任务?

时间:2011-06-24 00:56:29

标签: java android multithreading

现在我正在尝试创建一个增加音量的函数,而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,该事件应该有希望停止执行此函数。然而,在测试中,我注意到在它应该发生之后的一段时间内不会发生这种情况,并且因为在我猜测那里存在问题之前我从未做过很多线程。

那我该怎么做呢?

感谢。

2 个答案:

答案 0 :(得分:2)

我不确定你是否采用正确的方法,但这里是如何解决当前的代码。

1)使你的标志变量不稳定。

2)为标志提供同步的getter和setter方法。

问题是由Java的内存模型引起的。由于您有2个线程访问同一个字段,因此您需要提供一种同步其访问权限的方法。现在,2个线程可能看不到彼此对共享字段的更改。对于使用volatile的简单布尔值可能更有效。

答案 1 :(得分:0)

这个代码在自己的Thread中运行是从服务中的某个地方开始的吗?如果你还没有创建一个单独的Thread,那么它会在进程主线程上运行并阻塞它,这可能会导致你的不可预测的结果。