【问题标题】:How to handle runtime exception on playing audio files?如何处理播放音频文件的运行时异常?
【发布时间】:2010-03-15 08:32:10
【问题描述】:

我有一个在其点击监听器上播放音频文件的按钮。如果在播放音频文件时一次又一次地单击按钮,则应用程序崩溃。解决办法是什么?

这里有一些代码供参考:

 private OnClickListener btnMercyListener = new OnClickListener()
    {

        public void onClick(View v)
        {                        
           // Toast.makeText(getBaseContext(), 
             //       "Mercy audio file is being played", 
               //       Toast.LENGTH_LONG).show();

            if (status==true)
            {
                mp.stop();
                mp.release();
                status = false;

            } 
            else
            {
            mp = MediaPlayer.create(iMEvil.this,R.raw.mercy); 


          //mp.start();

            try{
                mp.start();
                status= true; 
                //mp.release();
               }catch(NullPointerException e)
               {
                   Log.v("MP error",e.toString());
               }

            }

            mp.setOnCompletionListener(new OnCompletionListener(){ 

                   // @Override 
                   public void onCompletion(MediaPlayer arg0) { 
                      mp.release();
                      status = false;

                   } 
              }

          ); 



        }
    };

【问题讨论】:

  • 为什么不尝试捕获一个异常?
  • 它永远不会在模拟器上显示我。我必须在设备上测试它。当按钮连续点击 8 次或更多次时,应用程序就会崩溃。我使用了一个名为 status 的公共布尔变量,并尝试将其值设置为仅在未播放现有声音时播放。想知道 isPlaying() 布尔方法是否可以帮助我?我现在卡住了。有什么线索吗?
  • 如果应用程序崩溃我很确定它会抛出异常,所以尝试捕获异常并将其写入日志然后调试异常。

标签: java android audio android-mediaplayer


【解决方案1】:

两件事:
1. 调试崩溃并查看失败的位置(哪一行)。
2. 用 try/catch 包围整个语句,然后简单地捕捉 Exception

如果您有异常或更好地了解您的代码失败的地方,那么就如何修复它向您提供建议会容易得多......事实上,您甚至可能不需要修复建议它,你可能最终会自己解决问题,然后你会收获自己成功的果实。

按 cmets 更新:
MediaPlayer 的文档指出了考虑到 OP 看到的症状可能是什么问题:

要停止播放,请致电stop()。如果您希望稍后重播媒体,则 在调用之前,您必须 reset()prepare() MediaPlayer 对象 start() 再次。 (create() 第一次调用prepare()。)

看起来如果播放按钮被按下太多次,那么媒体可能最终不会处于准备状态,从而引发一些异常。禁用播放按钮的想法是有效的,它应该处理这种情况。

以下是一些说明性代码,说明您希望程序执行的操作:

private OnClickListener btnMercyListener = new OnClickListener()
{
    public void onClick(View v)
    {
        if(isPressed)
        {
            return;
        }

        isPressed = true;

        // create your media player
        mp = MediaPlayer.create(iMEvil.this,R.raw.mercy); 

        // set your listener
        mp.setOnCompletionListener(mp.setOnCompletionListener(new OnCompletionListener(){ 

            // @Override 
            public void onCompletion(MediaPlayer arg0) {
                    if(!isPressed)
                    {
                        return;
                    }

                    isPressed = false;

                    // re-enable your play button
                    playButton.enable();

                    // disable the pause button
                    pauseButton.disable();

                    mp.release();
                    mp.prepare();
                } 
            }
        );

        // disable the play button
        playButton.disable();

        // enable the pause button
        pauseButton.enable();

        // start playback
        mp.start();
    }
};

当然,您应该在其中包含适当的 try/catch 语句,这样您的应用就不会崩溃,但是这段代码应该让您大致了解该怎么做。

【讨论】:

  • 感谢您在这里提出的建议。我已经制定了所需的代码。但现在我希望在播放声音时禁用我的按钮。一旦音频文件结束,我希望启用我的按钮。有什么线索吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多