java - Android线程在进程中间随机停止

标签 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%左右,甚至在接近完成的时候。有时甚至不启动! 我一直在试图找出原因,但我在任何地方都找不到有关线程中途停止等的任何信息。提前致谢! =)

最佳答案

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

关于java - Android线程在进程中间随机停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8413826/

相关文章:

android - Xamarin Forms Ui 项目(多平台)

android - 是真的吗?基于Adobe AIR的Android开发没有前途

c# - 如何模拟函数空间

用于多线程的 Java 进程外组件

java - 是否可以仅对 Runnable 进行沙箱处理

java - 通过 PCF 获取 Websphere MQ 对象授权

android - SharedPreferences.Editor 可以重复使用吗?

.net - 在多线程中使用 GDI+ 的问题 (VB.NET)

C# GUI 应用程序,另一个线程更新 UI 的另一个类

java - Spark 中对 JAVA 的 SQL 查询