2010-03-15 123 views
1

我有一个按钮,它的点击监听器上播放一个音频文件。如果在音频文件播放过程中再次点击该按钮,则该应用程序会崩溃。什么是解决方案?如何处理播放音频文件的运行时异常?

这里是参考一些代码:

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; 

        } 
       } 

     ); 



     } 
    }; 
+0

你为什么不尝试抓住一个异常? – Kiril 2010-03-15 08:49:46

+0

它从来没有在模拟器上显示我。我必须在设备上测试它。当连续点击8次或更多次时,应用程序崩溃。 我已经使用了一个名为status的公共布尔变量,并尝试将其值设置为仅在现有声音未播放时播放。不知道isPlaying()布尔方法能帮助我吗?我困在此刻。任何线索? – 2010-03-15 10:26:14

+0

如果应用程序崩溃,我很确定它会抛出异常,所以尝试捕获异常将它写入日志,然后调试异常。 – Kiril 2010-03-15 16:16:45

回答

0

两件事情:
1.调试崩溃,看看它的失败(该行)。
2.用try/catch环绕整个语句,并简单地捕获一个Exception

如果您在代码失败的情况下有异常或更好的想法,那么就如何解决问题给出建议将会容易得多...事实上,您可能甚至不需要建议修理它,你可能会自己解决问题,然后你会收获自己成功的成果。每评论

更新:
MediaPlayer文档表示可能是什么问题给出的OP是看到症状:

要停止播放,请拨打stop()。如果您希望以后重播媒体,则必须再次拨打 start()之前您必须使用reset()prepare()MediaPlayer对象。 (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语句,但此代码应给你一个大概的想法。

+0

我很欣赏你在这里建议的。我已经制定了所需的代码。但是现在我希望我的按钮在播放声音时被禁用。一旦音频文件结束,我希望启用我的按钮。有关于此的任何线索? – 2010-03-15 14:02:03