0

当我在屏幕上按下图像时,它会调用 powerButton.OnClickListener() 就像它应该的那样,经过几秒钟的缓冲,流播放得很好。但是,人们希望显示一个简短的 toast 弹出窗口以通知用户“无线电流正在连接,请稍候......”

这就是问题所在,无论我尝试了什么以及我将创建 toast 弹出窗口的行放在哪里,它在进入缓冲之前都不会显示。

任何帮助将不胜感激,我已经添加了大部分代码,如有必要,将提供更多。

        // run on powerButton click
    powerButton.setOnClickListener(new OnClickListener()
        {
        public void onClick(View view)
        {
            // check if the player is started or stopped
            if (isPlaying) // player is streaming
            {
                // stop the stream and set isPlaying to false
                mediaPlayer.stop();

                // release the media player
                releaseMediaPlayer();

                // update notification
                mNotificationManager.cancel(SIMPLE_NOTFICATION_ID);

                // set power button to "powered off" image
                powerButton.setImageResource(R.drawable.power_off);
            }
            else // player not streaming
            {
                // notify the user that the stream is loading
                final Toast streamLoading = toast.makeText(getBaseContext(), "Radio Stream Connecting, Please Wait...", Toast.LENGTH_SHORT);
                streamLoading.show();

                // try catch block to attempt connecting to radioUrl
                try
                {                       
                    // create new instance of media player
                    mediaPlayer = new MediaPlayer();

                    // set media player to handle audio streams                    
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

                    // connect to radio stream and fill buffer
                    mediaPlayer.setDataSource(radioUrl);
                    mediaPlayer.prepare(); // might take long depending on buffering speed

                    // start the media player and set isPlaying to true
                    mediaPlayer.start();
                    isPlaying = true;

                    // update notification, clear stream message
                    createNotification();

                    // set power button to "powered on" image
                    powerButton.setImageResource(R.drawable.power_on);
                }
                catch (IllegalArgumentException e) // cannot connect to stream
                {
                    // clear streaming text and notify user of failure
                    final Toast streamError1 = Toast.makeText(MainMenu.this, "Failed to load: Unable to connect to stream!", Toast.LENGTH_SHORT);
                    streamError1.show();

                    // release the media player and display error
                    releaseMediaPlayer();
                    mNotificationManager.cancel(SIMPLE_NOTFICATION_ID);
                    e.printStackTrace();
                }
                catch (IllegalStateException e) // stream cannot play audio
                {
                    // clear streaming text and notify user of failure
                    final Toast streamError2 = Toast.makeText(getBaseContext(), "Failed to load: cannot play stream!", Toast.LENGTH_SHORT);
                    streamError2.show();

                    // release the media player and display error
                    releaseMediaPlayer();
                    mNotificationManager.cancel(SIMPLE_NOTFICATION_ID);
                    e.printStackTrace();
                }
                catch (IOException e) // general connection issue
                {
                    // clear streaming text and notify user of failure
                    final Toast streamError3 = Toast.makeText(getBaseContext(), "Failed to Load: Connection issue!", Toast.LENGTH_SHORT);
                    streamError3.show();

                    // release the media player and display error
                    releaseMediaPlayer();
                    mNotificationManager.cancel(SIMPLE_NOTFICATION_ID);
                    e.printStackTrace();
                }
            }

        }
    });
4

2 回答 2

2

这是因为在您从 onClick 返回之前,toast 不会显示,因为那是 UI 线程。I 在缓冲开始之前你不会这样做。我认为要获得您想要的效果,您检查 AsynchTask 以在后台线程中进行缓冲并立即从 onClick 返回。

事实上,你这样做的方式是,如果缓冲时间过长,你的应用程序将被 android 标记为无响应。

于 2011-12-03T00:16:35.993 回答
0

尝试使用AsyncTask,其中 AsyncTask 所做的第一件事是在进入缓冲过程之前显示 toast。

于 2011-12-03T00:17:16.620 回答