Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 声音播放早于视图更改_Java_Android_Android Layout_Android View_Android Thread - Fatal编程技术网

Java 声音播放早于视图更改

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

我正在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();
        }
    });
使用“录制”和“停止”按钮,该功能正常运行

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!更新了答案之外。