Android 点击列表项时获取NPE

Android 点击列表项时获取NPE,android,android-listview,android-mediaplayer,Android,Android Listview,Android Mediaplayer,我在列表视图中列出音频文件并播放一个用户点击过的歌曲,但当用户点击列表中的任何其他歌曲(如果已经播放第一首歌曲)时,我会得到NPE mediaPlayer = new MediaPlayer(); ............................. listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick

我在列表视图中列出音频文件并播放一个用户点击过的歌曲,但当用户点击列表中的任何其他歌曲(如果已经播放第一首歌曲)时,我会得到NPE

   mediaPlayer = new MediaPlayer();

   .............................

   listview.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                long id) {                  

                strNURL = videoMovieArrayList.get(position).getUrl().toString();                

                if(mediaPlayer!=null && mediaPlayer.isPlaying())
                    try {
                        mediaPlayer.stop();
                        mediaPlayer.release(); 
                      } catch (Exception e) { 

                      }
                    play(arg1);
                }
        }); 


  public void play(View view){         
       mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // NPE
        try {
            mediaPlayer.setDataSource(strNURL);
        } catch (IllegalArgumentException e) {
        ............
    });
   }

在try-catch中,您使
mediaPlayer=null
然后调用play方法,在这里您试图将AudioStreamType设置为空值

因此NPE发生了

删除
mediaPlayer=null从尝试捕获

在release()之后,该对象不再可用

因此,创建
mediaPlayer=newmediaplayer()
然后调用play方法

        mediaPlayer.setDataSource(strNURL));
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_RING);
        mediaPlayer.prepare();
        mediaPlayer.start();

问题在于,您可以释放
mediaPlayer
对象

if(mediaPlayer!=null && mediaPlayer.isPlaying())
                try {
                    mediaPlayer.stop();
                    mediaPlayer.release(); 
                  } catch (Exception e) { 

                  }
                play(arg1);
            }
并调用方法
play(arg1)
到下一个,但此时您的
mediaPlayer
对象将为空,因此您将获得NPE。所以就用这个吧

  listview.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position,
            long id) {                  

            strNURL = videoMovieArrayList.get(position).getUrl().toString();                

            if(mediaPlayer!=null)
                try {
                    play(arg1);
                  } catch (Exception e) { 

                  }

            }
    }); 
listview.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共单击(适配器视图arg0,视图arg1,内部位置,
长id){
strNURL=videoMovieArrayList.get(position.getUrl().toString();
如果(mediaPlayer!=null)
试一试{
play(arg1);
}捕获(例外e){
}
}
}); 

发布日志,然后……在上面创建对象mediaPlayer@MD谢谢我发布了日志请立即检查适配器中的此错误在列表视图中创建coustem适配器请发布MusicTrackActivity的第240行。当前歌曲完成后如何播放下一首歌曲?
  listview.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position,
            long id) {                  

            strNURL = videoMovieArrayList.get(position).getUrl().toString();                

            if(mediaPlayer!=null)
                try {
                    play(arg1);
                  } catch (Exception e) { 

                  }

            }
    });