【发布时间】:2012-01-14 21:02:00
【问题描述】:
正如问题所说,这是代码。
我想要做的基本上是我有一个数组列表,上面写着“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%,甚至是接近完成时。有时它甚至没有开始! 我一直在试图找出原因,但我在任何地方都找不到关于 Thread 中途停止或类似情况的任何信息。提前致谢! =)
【问题讨论】:
-
当线程以
musicPlaying变量的状态结束时记录一条消息可能会对您有所帮助。我敢打赌@Tudor 是正确的,musicPlaying会在线程之间随机更新。 -
等一下,如果我在 Thread 中的 Log 消息即使在我退出应用程序时仍然显示消息,这意味着
musicPlaying在整个过程中仍然是 true,对吧? -
@Gray 我应该在哪里记录消息?将日志放入 looper 淹没了我的 logcat 并且线程继续运行并在我退出应用程序时显示 musicPlaying 的“true”
-
我会将消息放在
while循环“当线程完成时”之后。只是认为确保musicPlaying是错误的对您有帮助。 -
@Gray 我已经输入了一条日志消息,上面写着“音乐完成”并且它被调用了。无论如何,感谢您的输入,问题已解决 =)
标签: java android multithreading loops