Java MediaPlayer点击后退按钮时出现空指针异常
Java MediaPlayer点击后退按钮时出现空指针异常,java,android,media-player,android-mediaplayer,Java,Android,Media Player,Android Mediaplayer,流式音频在线,但每次点击后退按钮(当播放音乐)时,总是会出现空点异常 这是行,我在UpdateSongTimeRunnable中遇到异常: startTime = mediaPlayer.getCurrentPosition(); // NullPointerException 代码如下所示: public TextView startTimeField,endTimeField; private double startTime = 0;
流式音频
在线,但每次点击后退
按钮(当播放音乐
)时,总是会出现空点异常
这是行
,我在UpdateSongTime
Runnable中遇到异常:
startTime = mediaPlayer.getCurrentPosition(); // NullPointerException
代码如下所示:
public TextView startTimeField,endTimeField;
private double startTime = 0;
private double finalTime = 0;
private SeekBar seekbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music_player);
public void play(View view){
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(videoURL);
} catch (IllegalArgumentException e) {
} catch (SecurityException e) {
} catch (IllegalStateException e) {
} catch (IOException e) {
e.printStackTrace();
}
try {
mediaPlayer.prepare();
} catch (IllegalStateException e) {
} catch (IOException e) {
}
mediaPlayer.start();
finalTime = mediaPlayer.getDuration();
startTime = mediaPlayer.getCurrentPosition();
if(oneTimeOnly == 0){
seekbar.setMax((int) finalTime);
oneTimeOnly = 1;
}
endTimeField.setText(String.format("%dm:%ds",
TimeUnit.MILLISECONDS.toMinutes((long) finalTime),
TimeUnit.MILLISECONDS.toSeconds((long) finalTime) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.
toMinutes((long) finalTime)))
);
startTimeField.setText(String.format("%dm:%ds",
TimeUnit.MILLISECONDS.toMinutes((long) startTime),
TimeUnit.MILLISECONDS.toSeconds((long) startTime) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.
toMinutes((long) startTime)))
);
seekbar.setProgress((int)startTime);
myHandler.postDelayed(UpdateSongTime,100);
pauseButton.setEnabled(true);
playButton.setEnabled(false);
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer arg0) {
// TODO Auto-generated method stub
pauseButton.setEnabled(false);
playButton.setEnabled(true);
startTimeField.setText("0m:0s");
seekbar.setProgress(0);
}
});
}
private Runnable UpdateSongTime = new Runnable() {
public void run() {
startTime = mediaPlayer.getCurrentPosition(); // NullPointerException
startTimeField.setText(String.format("%dm:%ds",
TimeUnit.MILLISECONDS.toMinutes((long) startTime),
TimeUnit.MILLISECONDS.toSeconds((long) startTime) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.
toMinutes((long) startTime)))
);
seekbar.setProgress((int)startTime);
myHandler.postDelayed(this, 100);
}
};
public void pause(View view){
mediaPlayer.pause();
pauseButton.setEnabled(false);
playButton.setEnabled(true);
}
/** Called just before the activity is destroyed. */
@Override
public void onDestroy() {
super.onDestroy();
if(mediaPlayer!=null && mediaPlayer.isPlaying()){
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
}
我没有在我的代码中实现什么?需要在我的代码中进行更改的地方 您缺少在
活动的的onDestroy()
中删除处理程序回调
在ondestory()方法中添加此行
myHandler.removeCallbacks(this);
非常感谢:)5分钟后我就可以接受你的回答了,你的伎俩对我起了作用——谢谢。。我使用了:myHandler.removeCallbacks(UpdateSongTime);mediaplayer完成时如何将seekbar重置为起始位置?@Sophie完成时通过seekbar将seekbar进度设置为零。setProgress(0)@苏菲:好的。。您的onCompleteListener正在呼叫吗?完成后的seekbar位置是什么?如何记录seekbar位置?