TimerTask is already scheduled

10,131

Try this code block please:

sb.setProgress(0);
sb.setMax(mainPlayer.getDuration());
mainPlayer.start();
timer = new Timer();
MyTask task=new MyTask();
timer.schedule(task,0, 1000);

private class MyTask extends TimerTask {
    public void run() {
        //Your code...
    }
}
Share:
10,131
Admin
Author by

Admin

Updated on June 05, 2022

Comments

  • Admin
    Admin almost 2 years

    I have a MediaPlayer object which plays a local audio file. I am using a TimerTask to update the position of a SeekBar and text on a TextView while the audio plays.

    There is one button. When the user presses the button audio starts. When they press it a second time the audio stops. When they press it a third time to begin playback again the app crashes with the error

    'causedby: TimerTask is scheduled already and InvocationTargetException'.
    

    Here is my code:

        public void onAudioClicked(View v) {
        if (mainPlayer == null) {
            mainPlayer = MediaPlayer.create(this, R.raw.session1);
            // Get audio duration and set textview
            int d = mainPlayer.getDuration();
            TextView t = (TextView)findViewById(R.id.totalTime);
            t.setText(String.format("%d:%d", 
                    TimeUnit.MILLISECONDS.toMinutes(d),
                    TimeUnit.MILLISECONDS.toSeconds(d) - 
                    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(d))));
    
            sb.setProgress(0);
            sb.setMax(mainPlayer.getDuration());
            mainPlayer.start();
            timer = new Timer();
            timer.schedule(task, 1000);
        } else {
            mainPlayer.stop();
            mainPlayer.release();
            mainPlayer = null;
            timer.cancel();
            task.cancel();
            timer = null;
        }
    }
    
        TimerTask task = new TimerTask(){
        public void run(){
            int currentPosition = 0;
            int total = mainPlayer.getDuration();
            sb.setMax(total);
            while (mainPlayer != null && currentPosition < total) {
                try {
                    Thread.sleep(1000);
                    currentPosition = mainPlayer.getCurrentPosition();
                    runOnUiThread(updateControlsRunnable);
                } catch (InterruptedException e) {
                    return;
                } catch (Exception e) {
                    return;
                }
                sb.setProgress(currentPosition);
            }
    
        }
    };
    
    final Runnable updateControlsRunnable = new Runnable () {
        public void run(){
            int d = mainPlayer.getCurrentPosition();
            TextView t = (TextView)findViewById(R.id.currentTime);
            t.setText(String.format("%d:%d", 
                    TimeUnit.MILLISECONDS.toMinutes(d),
                    TimeUnit.MILLISECONDS.toSeconds(d) - 
                    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(d))));
            }
    };