Как проверить, включены ли переключатели, и выполнить действие, если они есть, но не все одновременно? - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь создать очень базовое c приложение, которое воспроизводит звук для каждой кнопки переключения, которое переключается при нажатии кнопки воспроизведения, но я не хочу, чтобы они воспроизводили звуки одновременно. Я хочу, чтобы все звуки воспроизводились с интервалом в 1 секунду. Метод воспроизведения, который я создал до сих пор, похоже, не работает, потому что я всегда слышу только 1 звук. Вот мой метод игры:

    public void play() {
        final Handler hand = new Handler();
        hand.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (button1.isChecked()) {
                    sp.play(snareId, 10, 10, 1, 0, 1);
                }
            }
        }, 0);
        hand.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (button2.isChecked()) {
                        sp.play(snareId, 10, 10, 1, 0, 1);
                    }
                }
                }, 1000);
        hand.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (button3.isChecked()) {
                        sp.play(snareId, 10, 10, 1, 0, 1);
                    }
                }
                }, 2000);
        hand.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (button4.isChecked()) {
                        sp.play(snareId, 10, 10, 1, 0, 1);
                    }
                }
                }, 3000);
        }

Я не очень понимаю, почему это не работает должным образом. Кроме того, есть ли еще один более простой способ достичь той же цели?

1 Ответ

0 голосов
/ 24 марта 2020

Проблема в том, что каждый экземпляр обработчика связан только с одним потоком. Вы не можете использовать один такой обработчик для 4 разных Runnables. По сути, вы всегда отменяете предыдущий набор Runnable и, следовательно, можете слышать только звук последнего набора Runnable.

EDIT (снова):

У меня нет Java IDE или даже Android Studio в настоящее время установлена ​​на этом устройстве, поэтому следующий код является лишь идеей и не тестируется, но я думаю, что он может работать.

public void play() {

    List<int> soundIDs = new List<int>();

    if (button1.isChecked()) {
        soundIDs.add(snareID);      //you probably might want to set these IDs different, but I assume snareID for example stands for one of the IDs of one of your sound files
    }
    if (button2.isChecked()) {
        soundIDs.add(snareID);
    }
    if (button3.isChecked()) {
        soundIDs.add(snareID);
    }
    if (button4.isChecked()) {
        soundIDs.add(snareID);
    }


    final Handler hand = new Handler();
    hand.postDelayed(new Runnable() {
        @Override
        public void run() {
            if(soundIDs.size() > 0) {
                sp.play(soundIDs.get(0), 10, 10, 1, 0, 1);
                soundIDs.remove(0);
                handler.postDelayed(this, 1000);
            }
        }
    }, 1000);
}

Как я уже сказал, я не тестировал его и другие могут иметь лучшее решение, но я надеюсь, что это сработает. Разница во времени между звуками составляет (как в вашем коде) 1000 между каждым началом звука. Но имейте в виду, что это не обязательно означает, что у вас есть задержка 1000 между концом одного звука и началом следующего звука.

...