在尝试限制电池使用时,我不需要有繁忙的循环,所以我不确定如何解决这个问题。
如果我有一个程序,允许某人唱歌 45 秒,然后他们暂停 20 秒喝一杯,然后重复唱一定数量的歌曲。
我的计时器是在取消一次迭代并开始另一次迭代后,计时器无法正常工作 https://stackoverflow.com/questions/5751570/problem-getting-timer-to-work-after-cancelling-one-iteration-and-starting-another/5774610#5774610,但为了使其工作,当有人单击按钮时,它会开始第一个倒计时,但时间已排队,并显示标题,然后当时间完成时,它会显示Rest,然后 20 秒后会显示新标题。
So use sendMessageDelayed
是一个问题,尽管它适用于第一部分。
理想情况下我希望有Runnable
当达到倒计时时返回到某个控制器函数,然后该函数将使用 if 语句。
void Controller(int curCount) {
if(curCount % 2 == 0) {
// call thread that uses runnable with next song time limit and title
} else {
// call thread with 20 and "REST"
}
}
但是,这只有在以下情况下才有效
Thread t = new Thread(runnable);
... // Go to controller, which will count down
t.join();
阻塞直到完成。我可以t.wait(time * 1000);
代替t.join()
,但这可能有点晚或早,因为计时器在计时方面并不完美,所以我认为这是不正确的。
那么,在没有不必要的轮询或繁忙循环的情况下执行此类操作的最佳方法是什么?
for(SongModel m : songList) {
countdownTime(m.getSongTime(), m.getTitle);
countdownTime(10, "REST");
}
Edit:
我想我不清楚当前计时器的问题。由于消息已排队,它将更改为Rest一边还在倒计时第一首歌的剩余时间,Runnable
完成速度比Handler
正在处理。因此,这种方法存在一个缺陷,导致我考虑使用sendMessageDelayed
不过,不会像我希望的那样工作,如果我只需要倒计时一次/单击按钮就可以了,但我的需要是通过单击一个按钮来实现这一切,它启动该过程,然后应该模拟这for
在我的问题末尾循环。