2012-10-04 71 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; 
     } 

    }); 
}