在BaseAdapter android中停止媒体播放器

时间:2014-11-18 22:37:50

标签: android android-mediaplayer baseadapter

我有一个Fragment,其中ListView是一个声音列表,以这种方式填充:

MediaPlayer mMediaPlayer;

listview.setAdapter(new ListAdapter(getActivity(), tit, desc, songs, filenames, mMediaPlayer));

MediaPlayer是作为参数给出的,因为我希望当按下后退按钮或应用程序进入后台时,播放器将停止播放。 所以我在我的片段中覆盖onPause和onDestroy方法,但这不起作用。即使应用关闭,声音也会继续播放。这是我的代码:

         @Override
        public void onDestroy() {
          // TODO Auto-generated method stub
          if (mMediaPlayer != null) {
              mMediaPlayer.stop();
              mMediaPlayer.release();
              mMediaPlayer = null; 
          }
          super.onDestroy();
         }

         @Override
        public void onPause() {
          // TODO Auto-generated method stub
          if (mMediaPlayer != null) {
              mMediaPlayer.stop();
              mMediaPlayer.release();
              mMediaPlayer = null; 
          }
          super.onPause();
         }

我在BaseAdapter课堂上播放声音,这样:

public void playSound2(int pos){

        if(isPlaying){  
            mMediaPlayer.stop();  
            mMediaPlayer.release();
            mMediaPlayer = null;
            isPlaying = false;

    }
        mMediaPlayer = MediaPlayer.create(context, songs[pos]);
        mMediaPlayer.start();
        isPlaying = true;

    }

你有什么建议吗?谢谢。

1 个答案:

答案 0 :(得分:2)

我的第一个建议是:不要使用适配器与媒体播放器进行交互。而是将项目点击监听器附加到列表视图,如此

listView.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        ...
    }});

并在onItemClick回调中对媒体播放器执行任何操作。

话虽这么说,你应该在你的onclicklistener内部重置你的媒体播放器,如此

try {
       mPlayer.reset();
       mPlayer.setDataSource(trackToBePlayed); //trackToBePlayed is dependent on the select position
       mPlayer.setOnPreparedListener(mPreparedListener);
       mPlayer.prepareAsync();

} catch (IOException e) {

} catch(IllegalArgumentException e) {

}

在mPreparedListener中,准备就绪后,

mPreparedListener = new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
    }
};

这足以指出你正确的方向:)