Моя программа перестает отвечать на запросы после нажатия кнопки воспроизведения

Поэтому я создал небольшое приложение с кнопкой воспроизведения и кнопкой «Стоп». Когда я нажимаю кнопку воспроизведения, она должна повторяться до тех пор, пока я не нажму кнопку остановки. Проблема в том, что после нажатия кнопки воспроизведения я больше ничего не могу сделать, и кнопка остановки не реагирует. Если я пытаюсь нажать кнопку «Стоп», мое приложение сообщает, что приложение не отвечает и завершает работу. Я не знаю, почему это происходит, и я очень плохо знаком с Android и Java, поэтому мне немного сложно понять, почему это не работает. Вот мой фактический код:

Воспроизвести и остановить метод:

   public void play() {
    playing = true;
    while (playing) {
        for (int i = 0; i < 4; i++) {
            if (buttonArray[i].isChecked()) {
                sp.play(snareId, 1, 1, 1, 0, 1);
            }
            if (!playing) {
                break;
            }
            try {
                Thread.sleep(1000);
                if(i == 3) i = -1;

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public void stop(){

    playing = false;//
}

Основная деятельность

 playButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v)
        {
            mySample.play();
        }
    });

    stopButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v)
        {
            mySample.stop();
        }
    });

Всего 1 ответ


Согласно документу Android, есть несколько общих шаблонов, которые нужно искать при диагностике ANR:

  1. Приложение выполняет медленные операции, связанные с вводом-выводом в основном потоке.
  2. Приложение выполняет долгий расчет в главном потоке.
  3. Основной поток выполняет синхронный вызов связывания с другим процессом, и этому другому процессу требуется много времени для возврата.

    И другие.

Вы находитесь в ситуации номер 2, потому что вы создаете бесконечный цикл while(playing) в основном потоке (в данном случае это поток пользовательского интерфейса). Просто слушайте изменения из флажков и делайте свою задачу соответственно.

public void play(){
   //call startService to play sound
   //for each toggle button
   buttonArray[i].setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
          if (isChecked) {
            //do your tasks
          } else {
            //do your tasks
          }
       }
   });
}

public void stop(){
    //call stopService to play sound
    //for each toogle button:
    buttonArray[i].setOnCheckedChangeListener(null);
}

Есть идеи?

10000