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...
}
}
Author by
Admin
Updated on June 05, 2022Comments
-
Admin almost 2 years
I have a
MediaPlayer
object which plays a local audio file. I am using aTimerTask
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)))); } };