我有一個應用程序,播放一個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()
)?還有別的嗎?