Звук воспроизводится до изменения вида

Я создаю приложение для пианино в студии Android:

скриншот приложения

У меня есть прослушиватель щелчка для моей кнопки воспроизведения, который при нажатии должен сделать кнопки записи и воспроизведения невидимыми, а кнопку остановки - видимой во время воспроизведения записанных звуков.

Кнопка воспроизведения

mBtn_Play.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            mRecordingState = "Playing";
            switchButtonVisibility();

            for (final int sound: mListRecordedSounds )
            {
                if (mRecordingState == "Ready")
                {//break out of loop when stop button is pressed
                    break;
                }
                else {

                    mSoundPool.play(sound, 1,1,1,0,1);
                    try
                    {
                        Thread.sleep(500);
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        }
    });
}

Способ переключения видимости кнопки

private void switchButtonVisibility()
{

    if (mRecordingState != "Ready")
    {
        mBtn_Stop.setVisibility(View.VISIBLE);
        mBtn_Record.setVisibility(View.GONE);
        mBtn_Play.setVisibility(View.GONE);

    }
    else
    {
        mBtn_Stop.setVisibility(View.GONE);
        mBtn_Record.setVisibility(View.VISIBLE);
        mBtn_Play.setVisibility(View.VISIBLE);
    }

}

С кнопками записи и остановки все работает правильно

mBtn_Record.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            mListRecordedSounds.clear();
            mRecordingState = "Recording";
            switchButtonVisibility();

        }
    });
mBtn_Stop.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            mRecordingState = "Ready";
            switchButtonVisibility();
        }
    });

По какой-то странной причине он сначала выполняет цикл for и воспроизводит звуки до того, как метод switchButtonVisibility(); изменит видимые кнопки. Кажется, это не имеет никакого смысла, поскольку метод находится над циклом. Есть ли способ установить его так, чтобы видимость кнопки изменялась сначала перед выполнением цикла и воспроизведением звуков?


person Robin Sanders    schedule 04.12.2017    source источник


Ответы (1)


Отложить выполнение, опубликовав событие в представлении. Это гарантирует, что действие будет выполнено, как только представление будет обновлено:


    @Override
    public void onClick(View v) {
        mRecordingState = "Playing";
        switchButtonVisibility();

        mBtn_Play.post(new Runnable() {
            @Override
            public void run() {
                for (final int sound : mListRecordedSounds ) {
                    // play the sound here
                    ...
                }
            }
        });
    }

person azizbekian    schedule 04.12.2017
comment
Спасибо, @azizbekian, вы решили мою проблему. за исключением того, что это должно быть mBtn_Play.post(new Runnable() { вместо mBtn_Stop.post(new Runnable() { - person Robin Sanders; 04.12.2017
comment
Хороший! Обновил ответ. - person azizbekian; 04.12.2017