2011-03-15 40 views
0

我有一個應用程序,播放一個MP3文件,我試圖更新自定義字段與某些時候我們有聲音播放列表(有點像卡拉OK效果)同步。我正在使用Handler來安排這些更新。在我的自定義字段級的,我定義應該是在正確的時間運行更新一個Runnable問題同步聲音和顯示

private final Runnable mTrigger = new Runnable() { 
    @Override 
    public void run() { 
     int now = mPlayer.getCurrentPosition(); 
     if (mState == STATE_PLAYING && mUpdateAction != null) { 
      if (mTriggerTime - now > MAX_PREMATURE_TRIGGER) { 
       // Sound is lagging too much; reschedule this trigger 
       mHandler.postDelayed(this, mTriggerTime - now); 
      } else { 
       // Run the update 
       mUpdateAction.run(); 
      } 
     } 
    } 
}; 

當我打電話mPlayer.start()我計劃通過調用mHandler.postDelayed(mTrigger, timeToFirstUpdate)第一次更新。每個更新操作決定下一次更新的內容並安排它(通過調用mHandler.postDelayed(mTrigger, timeToNextUpdate))。更新時間通常是幾百毫秒。

問題是,雖然有些更新在預定時間內即時發生,但其他更新可能會延遲200毫秒或更長,這對用戶來說非常明顯。除了播放聲音之外,我在這些更新之間沒有在應用程序中做任何事情。 (沒有後臺工作線程,沒有其他顯示更新。)延遲似乎是隨機的,每次都會有相當大的變化。

我不認爲postDelayed的時機會是這樣不準確!我不知道這是模擬器問題還是我的方法存在問題。聲音播放是否搞砸了UI線程循環的時間?我應該將時間移動到後臺線程中(並且可以安全地從後臺線程中調用mPlayer.getCurrentPosition())?還有別的嗎?

回答

0

經過大量實驗後,仿真器看起來像是問題所在。當我在更快的工作站上運行所有內容時,問題似乎消失了。