[英]TimerTask is already scheduled
我有一個播放本地音頻文件的MediaPlayer
對象。 我正在使用TimerTask
在播放音頻時更新SeekBar的位置和TextView上的文本。
有一個按鈕。 當用戶按下按鈕時音頻開始。 當他們第二次按下它時音頻停止。 當他們第三次按下它再次開始播放時,應用程序會因錯誤而崩潰
'causedby: TimerTask is scheduled already and InvocationTargetException'.
這是我的代碼:
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))));
}
};
請嘗試此代碼塊:
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...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.