正如问题所说,这是代码。
我想要做的基本上是我有一个数组列表,说“myArray”。此数组包含以毫秒为单位的存储时间点。接下来我想根据这些时间点调用一个方法。因此,我需要在音乐播放时从0开始运行时间计数器,逐步将时间计数器与数组中的时间点进行比较(从第一个数组索引到完成)。
第一种方法“timeCounter”是在通过MediaPlayer播放音乐时启动时间计数器的方法。
public void timeCounter(){
Runnable myRunnable = new Runnable(){
@Override
public void run(){
while(musicPlaying){
startCounter(arrayPos);
}
}
};
Thread musicPlayer = new Thread(myRunnable);
musicPlayer.start();
}
这是数组中时间计数器和时间的比较。
public void startCounter(List<Long> array){
elapsedTime = System.currentTimeMillis() - timeStart;
if(elapsedTime == array.get(arrayPos)){
arrayPos += 1; //Continue comparing with the next number in the array
Log.v("DEBUG", "TIME MATCHES!");
if(arrayPos>= array.size()){
arrayPos= 0; //Prevent out of array index
}
}
}
我的代码运行正常,LogCat的结果是正确的。
现在问题是有时线程没有运行,直到音乐播放完毕(我已经设置了onCompletionListener并在音乐结束时将“musicPlaying”设置为false)。停止点是完全随机的,有时刚开始时,或大约50%,或者甚至在接近完成时。有时它甚至没有开始! 我一直试图弄清楚为什么,但我找不到任何关于线程中途停止或任何地方的信息。提前致谢! =)
答案 0 :(得分:2)
如果musicPlaying
被修改并在线程之间读取,请确保它被声明为volatile
。
答案 1 :(得分:1)
我怀疑你的if(elapsedTime == array.get(arrayPos))
应该是if(elapsedTime >= array.get(arrayPos))
。
您需要记住,毫秒计时器不一定有一毫秒的时间。例如,在Windows上,返回的值只会每15毫秒左右更改一次。因此,您可能会完全错过特定时间,因此永远不会超过列表中的该条目。