Android-нить останавливается случайным образом в середине процесса - PullRequest
1 голос
/ 07 декабря 2011

Как говорится в вопросе, вот код.

Что я хочу сделать, так это то, что у меня есть список массивов, который говорит "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 останавливается на полпути или что-то подобное.Заранее спасибо!=)

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Если musicPlaying изменено и считано между потоками, убедитесь, что оно объявлено volatile.

1 голос
/ 08 декабря 2011

Я подозреваю, что ваш if(elapsedTime == array.get(arrayPos)) должен быть if(elapsedTime >= array.get(arrayPos)).

Вы должны помнить, что миллисекундный таймер не обязательно имеет тик в одну миллисекунду. Например, в Windows возвращаемое значение будет меняться только каждые 15 мс или около того. Поэтому вы можете полностью пропустить определенное время и, следовательно, никогда не пропустить эту запись в своем списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...