這次爲了完成學校裏的一個任務,就做了一個簡單的音樂播放器,當完成了基本功能後,在加個seekBar時使用了TimerTask,發現各種各樣的bug.
一個bug印象最爲深刻,每次當我開着音樂屏幕進入了鎖屏狀態的時候,再重新解鎖,就會報出
java.lang.IllegalStateException:TimerTask is scheduled already
解決辦法:
1)將timerTask以class的形式展現;
2)每次打開的時候先判斷相應的實例是否爲null,當!= null的時候 = null,並重新new一個;
3)很重要的一步,一定不要將 2)寫在 onCreate裏面,不然每次解鎖後的效果依舊是bug,我一般寫在onResume裏面;
代碼表示:
class Task extends TimerTask{
@Override
public void run() {
// TODO Auto-generated method stub
int current = MusicService.player.getCurrentPosition(); //獲取音樂當前position
int duration = MusicService.player.getDuration(); //獲取音樂總時長
//System.out.println(current+"----------------"+duration);
bar_music.setProgress(current);
bar_music.setMax(duration);
Message msg = new Message();
msg.what = ConstantUtil.CURRENT_TIME;
msg.arg1 = current;
msg.arg2 = duration;
handler.sendMessage(msg);
}
}
@Override
protected void onResume() {
super.onResume();
if (timer != null || task != null) {
timer = null;
task.cancel();
}
timer = new Timer();
task = new Task();
。。。
最後還有一個很重要的一項:
timer.scheduleAtFixedRate(task, 0, 200);
後面的那個200數字很重要,當然你不一定是200,有時候當這個數字表示的時間太小了的話
會導致在第一次打開seekBar時進度條不運行