【问题标题】:Sound plays earlier than view is changed在视图更改之前播放声音
【发布时间】:2017-12-04 13:59:01
【问题描述】:

我正在 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(); 方法更改可见按钮之前播放声音。这似乎没有任何意义,因为该方法位于循环之上。有什么方法可以设置它,以便在按钮可见性之前先更改 循环执行并播放声音?

【问题讨论】:

    标签: java android android-layout android-view android-thread


    【解决方案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 ... } } }); }

    【讨论】:

    • 谢谢你,@azizbekian 你已经解决了我的问题。除了应该是mBtn_Play.post(new Runnable() { 而不是mBtn_Stop.post(new Runnable() {
    • 不错!更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    相关资源
    最近更新 更多