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;

                   } 
              }

          ); 



        }
    };
4

1 回答 1

0

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

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

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

要停止播放,请调用stop()。如果您希望稍后重播媒体,那么您必须在reset() 再次调用 prepare() 该对象之前 。(第一次打电话。)MediaPlayerstart()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 语句,这样您的应用程序就不会崩溃,但是这段代码应该让您大致了解该做什么。

于 2010-03-15T08:54:08.877 回答