2012-10-04 69 views
2

我有一個ListView,當我點擊一行時,我會播放聲音。Android上的MediaPlayer啓動和停止

如果聲音在播放,我點擊另一行,第一個應該停止,第二個開始。

如果我不釋放MediaPlayer,應用程序會崩潰,但會延遲執行下一個聲音。

我在做什麼錯了?這是我的代碼:

public void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 

     if(!isPlaying){ 
      mPlayer = MediaPlayer.create(this,soundid[position]); 
      mPlayer.start(); 
      isPlaying = true; // reproducir es true 

     }else{ 

      isPlaying = false; 
      mPlayer.stop(); 
      mPlayer.reset(); 
      mPlayer = MediaPlayer.create(this,soundid[position]); 
      mPlayer.start(); 
      isPlaying = true; 

     } 

     mPlayer.setOnCompletionListener(new OnCompletionListener() { 

      public void onCompletion(MediaPlayer mPlayer) { 
       mPlayer.release(); 
       isPlaying = false; 
      } 

     }); 
    } 
+0

爲什麼不在else分支中釋放它呢? –

+0

我已更正了代碼。問題在於釋放需要很長時間並且會降低下一個聲音的重現。 – karse23

+0

mPlayer在哪裏聲明?在活動水平? – RvdK

回答

3

在這種類型的實現正在創建的媒體播放器的幾個實例,而不是將他們釋放可導致異常(refer here)。我建議你重新使用已經存在的媒體播放器實例。你可以通過做這樣的事情來實現你的目標。

public void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    if(!isPlaying){ 
     mPlayer = new MediaPlayer(); 
     mPlayer.setDataSource(soundid[position]); 
     mPlayer.prepare(); 
     mPlayer.start(); 
     isPlaying = true; 

    }else{ 

     isPlaying = false; 
     mPlayer.stop(); 
     mPlayer.reset(); 
     mPlayer.setDataSource(soundid[position]); 
     mPlayer.prepare(); 
     mPlayer.start(); 
     isPlaying = true; 

    } 

    mPlayer.setOnCompletionListener(new OnCompletionListener() { 

     public void onCompletion(MediaPlayer mPlayer) { 
      mPlayer.release(); 
      isPlaying = false; 
     } 

    }); 
}