在試圖限制電池使用情況時,我不需要有繁忙的循環,所以我不確定如何解決這個問題。計數45秒,暫停20秒,然後重複不同的標題
如果我有一個讓人唱歌45秒的節目,然後他們暫停20秒喝一杯,然後重複一些歌曲。
我的計時器是在Problem getting timer to work after cancelling one iteration and starting another,但爲了這個工作,當有人點擊一個按鈕它開始第一次倒計時,但時間排隊了,並顯示標題,然後當時間完成後將顯示其餘,然後在20秒後它會顯示一個新的標題。
所以使用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");
}
編輯:
我想我是不清楚我目前的計時器問題。由於消息正在排隊,它將變爲其餘,同時仍然減少剩餘的第一首歌曲的時間,因爲Runnable
比Handler
正在處理的速度快得多。所以,這種方法存在缺陷,導致我認爲使用sendMessageDelayed
這個設計不會像我所希望的那樣工作,但是,如果我只需要倒計時一次/按鈕點擊它將會很好,但我的需求要讓這一切都發生在點擊一個按鈕時,它會啓動該過程,然後在我的問題結束時模擬for
循環。
看看下面的想法。你可以很容易地查詢Listener構造函數中的歌曲列表,並創建一個ArrayList或任何你想要的,然後可以在if(!唱歌&& millis> = 20000L)塊中檢查它,以確定它是否應該調用一個新的'postDelayed()'或者只是返回; – Aleadam 2011-04-26 04:25:00