Java 声音播放早于视图更改
我正在android studio中创建一个钢琴应用程序: 我的播放按钮有一个点击式监听器,当按下该按钮时,录音和播放按钮将不可见,播放录制的声音时,停止按钮将可见 播放按钮Java 声音播放早于视图更改,java,android,android-layout,android-view,android-thread,Java,Android,Android Layout,Android View,Android Thread,我正在android studio中创建一个钢琴应用程序: 我的播放按钮有一个点击式监听器,当按下该按钮时,录音和播放按钮将不可见,播放录制的声音时,停止按钮将可见 播放按钮 mBtn_Play.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mRecordingState = "Play
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();
}
});
使用“录制”和“停止”按钮,该功能正常运行
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
循环,然后在开关按钮可视性()之前播放声音代码>方法更改哪些按钮可见。这似乎没有任何意义,因为该方法位于循环之上。有没有办法设置它,使按钮的可见性在启动前先更改
执行循环并播放声音?延迟执行,在视图上发布事件。这将确保在视图更新后立即执行操作:
@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
...
}
}
});
}
谢谢你,@azizbekian你已经解决了我的问题。除了应该是mbtnu Play.post(new Runnable(){
而不是mbtnu Stop.post(new Runnable(){
Nice!更新了答案之外。