我有一个方法在调用onPause后每次都抛出一个InvocationTargetException。它发生在“long totalDuration = mp.getDuration();”的行上。我如何停止此例外?
/**
* Background Runnable thread
* */
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
long totalDuration = mp.getDuration();
long currentDuration = mp.getCurrentPosition();
// Displaying Total Duration time
songTotalDurationLabel.setText(""+utils.milliSecondsToTimer(totalDuration));
// Displaying time completed playing
songCurrentDurationLabel.setText(""+utils.milliSecondsToTimer(currentDuration));
// Updating progress bar
int progress = (int)(utils.getProgressPercentage(currentDuration, totalDuration));
//Log.d("Progress", ""+progress);
songProgressBar.setProgress(progress);
// Running this thread after 100 milliseconds
mHandler.postDelayed(this, 100);
}
};
@Override
public void onPause(){
super.onPause();
if(mp != null){
try{
mp.stop();//mp=mediaplayer
mp.release();
} catch(Exception e){
Log.e(TAG, "Error in onPause()\n ");
}
}
}
答案 0 :(得分:3)
// mHandler -> mHandler Handler instance
// this -> mUpdateTimeTask Runnable anonymous class
mHandler.removeCallbacks( this );
不要立即停止,但要阻止下一次预定的通话。
答案 1 :(得分:1)
这种情况正在发生,因为在onPause
您正在调用mp.release()
这是正确的。但是,您的任务仍然是尝试在该时间点之后使用对它的引用。在onPause
设置标记mUpdateTimeTask
未运行的标记值。
课堂上的某个地方:
boolean volatile sentinel = false;
onResume
中的某处:
sentinel = false; // need to reset the flag
onPause
中的某处:
sentinel = true;
然后在mUpdateTimeTask
检查sentinel
如果确实如此,请不要运行您的代码,也不要重新发布。然后,您可以在onResume
中执行它。