如何暂停Android Background Runnable Thread?

时间:2013-08-10 03:42:43

标签: android eclipse background-thread

我有一个方法在调用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 ");
        }
    }

}

2 个答案:

答案 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中执行它。