我有一个播放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 :(得分:0)
经过多次试验,似乎问题是模拟器。当我在一个更快的工作站上运行所有东西时,问题似乎已经消失了。