Android Thread在进程中间随机停止

时间:2011-12-07 10:27:46

标签: java android multithreading loops

正如问题所说,这是代码。

我想要做的基本上是我有一个数组列表,说“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%,或者甚至在接近完成时。有时它甚至没有开始! 我一直试图弄清楚为什么,但我找不到任何关于线程中途停止或任何地方的信息。提前致谢! =)

2 个答案:

答案 0 :(得分:2)

如果musicPlaying被修改并在线程之间读取,请确保它被声明为volatile

答案 1 :(得分:1)

我怀疑你的if(elapsedTime == array.get(arrayPos))应该是if(elapsedTime >= array.get(arrayPos))

您需要记住,毫秒计时器不一定有一毫秒的时间。例如,在Windows上,返回的值只会每15毫秒左右更改一次。因此,您可能会完全错过特定时间,因此永远不会超过列表中的该条目。