Звук воспроизводится раньше, чем изменяется вид
Я создаю пианино в Android Studio:
У меня есть прослушиватель по нажатию кнопки воспроизведения, который при нажатии должен сделать кнопки записи и воспроизведения невидимыми, а кнопку остановки видимой во время воспроизведения записанных звуков.
Кнопка воспроизведения
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();
метод меняет какие кнопки видны. Это не имеет никакого смысла, так как метод находится над циклом. Есть ли способ установить его так, чтобы видимость кнопки изменялась в первую очередь перед выполнением цикла и воспроизведением звуков?
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
...
}
}
});
}