正如问题所说,这是代码。
我想做的基本上是我有一个数组列表,上面写着“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%左右,甚至在接近完成的时候。有时甚至不启动! 我一直在试图找出原因,但我在任何地方都找不到有关线程中途停止等的任何信息。提前致谢! =)
最佳答案
如果 musicPlaying
在线程之间被修改和读取,确保它被声明为 volatile
。
关于java - Android线程在进程中间随机停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8413826/