2010-03-15 125 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