android音樂播放器seekBar使用TimerTask問題

這次爲了完成學校裏的一個任務,就做了一個簡單的音樂播放器,當完成了基本功能後,在加個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時進度條不運行


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章