在循环内运行一次流程,不再重复该过程,直到被告知

时间:2014-03-26 15:55:39

标签: java android loops if-statement runnable

我有一个Android服务,它为我创造了一个很大的错误。它是一个带有if / else语句的runnable。基本上,我需要它连续运行检查并执行if连续。它完美无缺。我需要它只执行一次else,直到它再次检测到if。

我遇到的问题是它也在循环中运行else进程。如何在仍检测到if?

的同时使else语句运行一次

下面是代码示例......

         if(mTimer != null) {
            mTimer.cancel();
        } else {
            // recreate new
            mTimer = new Timer();
        }
        // schedule task
        mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);
    }



    class TimeDisplayTimerTask extends TimerTask {

        @Override
        public void run() {
            // run on another thread
            mHandler.post(new Runnable() {

                @Override
                public void run() {
                    // display toast

                    if(musicActive) {
                     // Set Ringer to vibrate

                  } else {
                        // Set Ringer to Normal


                  }
                }

            });
        }           

问题是,当服务正在运行且未检测到音乐时,人们无法更改其铃声设置,因为我的应用程序仍将其保留在服务中。如果我离开} else {空,我得到了我想要的结果,但我需要它来运行该过程一次以将振铃器设置为正常。我只是不需要它每秒钟将振铃器设置为正常。

2 个答案:

答案 0 :(得分:1)

最简单的方法就是记住这样的事情:

 boolean lastWasElse = false;


 mHandler.post(new Runnable() {

       @Override
       public void run() {

           if(true) {
                //  do this
                lastWasElse = false;
           } else if (!lastWasElse) {
                  // do once and then loop again, but if the answer is still "else" then skip this line.
                lastWasElse = true;
           }
       }

问题在于存储lastWasElse变量 - 因为您不断创建新的runnable。您需要集中存储该变量的一个副本,并在每次运行任务时进行检查......

...或者不断重复使用相同的Runnable而不是创建新的Runnable并将变量存储在{{1}}内。

答案 1 :(得分:0)

在开始定时器循环之前,我真的不明白为什么你不能只设置一次振铃模式:

myAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
// and then
// schedule task
mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);

更多评论:

您的TimerTask#run alread在后台线程中运行,您可以在此处完成工作而无需委托Handler的线程,我认为这是您的案例中的UI线程。在这种情况下,请确保您没有任何可能阻止UI的内容:

if(musicActive) {
    // do this
    // but watch out not to do blocking operations
}

否则,您只能将// Display Toast发布到处理程序的UI线程,并直接在if / else中执行TimerTask#run()