android中的setVisibility(int)在延迟后工作

时间:2016-03-09 22:58:38

标签: android

嘿伙计我正试图通过使用

按一下按钮来显示图像
Myimage.setVisibility(View.VISIBLE);

以下是代码的一部分:

case R.id.button5:
               if(myRandom == 5 )
                {
                   Myimage.setVisibility(View.VISIBLE);
                    MediaPlayer mp =  MediaPlayer.create(getApplicationContext(), R.raw.music);
                    mp.start();
                    while(mp.isPlaying())
                    {

                    }
                    found = true;

                }
                else

                 b5.setVisibility(View.GONE);
               break;

现在对于b5这是一个按钮视图,该功能正常工作,按钮消失。 对于Myimage但是getvisibility()告诉我它是==可见但我无法在屏幕上看到它,我只能在switch语句结束后看到它 有什么想法吗?

我尝试过这样定义一个函数,以便tit在一个单独的线程上运行,但我有同样的图像问题没有出现。

   public void startplayer()
       {
           Thread thread = new Thread(new Runnable() {
               public void run() {
                   mp = MediaPlayer.create(getApplicationContext(), R.raw.fart);
                   mp.start();
                   while(mp.isPlaying())
                   {

                   }
               }
           });
           thread.start();

感谢。

我最终得到了它:

 new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mp = MediaPlayer.create(getApplicationContext(), R.raw.donkey);
                       mp.start();
                       while(mp.isPlaying())
                       {

                       }


                    finish();
                }
            }, 0);

2 个答案:

答案 0 :(得分:1)

这可能是因为您使用while循环阻止UI线程。 你永远不应该做长时间的操作或等待主线程。

为了更好地理解主线程应该保持免费的原因,请阅读官方docs

在您的特定情况下,您应该实现回调。 只是做

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    override void onCompletion(MediaPlayer mp) {
        // Here you recieve the callback even.
    }
})

什么回调做(并在Android中习惯),当事情发生时通知你。因此,现在不要等待玩家自己完成游戏 - 只有在发生时才会收到通知。 请记住 - MediaPlayer知道它何时停止播放,你不应该为他做这份工作。 A nice blogpost with more info on callbacks

每当你想要进行while(true)循环时,再想一想 - 出了点问题。

答案 1 :(得分:0)

我认为您通过在UI线程上运行此代码来阻止UI线程:

fg

只要您的MediaPlayer对象正在播放,上面的代码在UI线程上的行为基本上就像无限循环。您应该将此代码块发布到后台线程上,或者至少是“while(mp.isPlaying())”部分。