2012-02-16 36 views
1

嗨,這裏是一段代碼...這個想法是,它運行20秒,然後在5秒鐘之前,它播放一個聲音,然後倒計時播放下一個...但它只是玩完了,跳過了5秒的標記......我嘗試過玩它,但無法讓它工作。播放倒計時結束前的聲音

任何想法?

//Counter 2 
final CountDownTimer counter2 = new CountDownTimer(20000 , 1000) { 
public void onTick(long millisUntilFinished) { 
    mCounter2TextField.setText(" " + formatTime(millisUntilFinished)); 

    long timeLeft = millisUntilFinished/1000; 

    if (timeLeft == 5000) 
     playAlertSound(R.drawable.sound1); 

} 

public void onFinish() { 
    start(); 
    playSound(); 
} 

public void playSound() { 
MediaPlayer mp = MediaPlayer.create(getBaseContext(), (R.drawable.sound2)); 
mp.start(); 

} 


}; 

回答

3

這是導致你:

playSound(...); 

是在同一個 '線' 爲您的定時器。你應該只是做財產以後這樣的:

if (timeLeft == 5000) 

    new Runnable(){ 
     void Run(){ 
      playAlertSound(R.drawable.sound1); 
     } 
     public void playSound() { 
      MediaPlayer mp = MediaPlayer.create(getBaseContext(), (R.drawable.sound2)); 
      mp.start(); 
     } 

    }.run(); 

或類似的東西:d

因爲你不能降低你的計時器,並在同一時間播放的聲音! :)

+0

+1,這是主要問題。我的答案解決了一些較簡單的問題,但這是真正發生的事情。 – 2012-02-16 20:05:29

+0

看到你的評論,並且你也是對的......他試圖比較兩個永遠不會匹配的值。 – Cehm 2012-02-16 20:07:28

1

你轉換millisUntilFinished以秒timeLeft,然後告訴它,如果有5000個秒(未毫秒)留給只玩。

當你正在做修復的變化,你也應該改變比較timeLeft <= 5所以它會開始播放,如果onTick被稱爲還剩4999毫秒。當然,如果它已經開始播放,您需要添加邏輯來不播放聲音。

+0

我甚至嘗試了5而不是5000仍然沒有工作因此5000是最後的嘗試,然後再問你chaps ... – Djorn 2012-02-16 19:58:07

+0

即使如此,它需要更正。另外,請檢查我的帖子的第二段。 Cehm的答案解決了主要問題。 – 2012-02-16 19:59:57

+0

@Djorn:根據系統中還在發生什麼,'onTick'幾乎不會在5000毫秒內被調用。它可以在4095ms的5005ms處或者在這些值之間的任何位置或甚至+/-這兩個值中的任何位置處被調用。 – Squonk 2012-02-16 20:07:32