【问题标题】:Android Thread stop randomly in the middle of processAndroid 线程在进程中间随机停止
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我已将musicPlaying 声明为volatile,但问题仍然存在。
  • 感谢提醒我使用volatile,如果我不使用可能会出现另一个错误。
【解决方案2】:

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

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

【讨论】:

  • 哦,可能是这样。好的,让我测试一下,稍后通知你
  • 看准了!我想使用== 对柜台来说是一种不好的做法。非常感谢! =)
猜你喜欢
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多