天天看點

Android中 利用Runnable和Handler實作定時器功能

今天在學習MediaPlayer中增加SeekBar随着播放進度實時更新的進度。此功能的實作方法:SeekBar每隔一段時間就調用其

setProgress()方法擷取MediaPlayer目前位置,詳細寫法如下:

mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
           

實作這個功能的關鍵點是如何讓這行代碼隔一段時間就執行,想到Timer不太會用,就先用自己熟悉的Runnable和Handler實作吧。而且這裡邊還涉及到更新UI,是以使用Runnable和Handler更加友善。

在Runnable中發送Message,Handler中接收到Message後更新SeekBar位置。

seekHandler = new Handler() {  
    public void handleMessage(Message message) {  
        super.handleMessage(message);  
        //Log.i("方法執行", "handleMessage");  
        if (message.what == 1) {  
            mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());   
        }  
    }  
};  
runnable = new Runnable() {  
    @Override  
    public void run() {  
        Message message = new Message();  
        message.what = 1;  
        seekHandler.sendMessage(message);   
    }  
};  
runnable.run(); // 啟動runnable  
           

這種寫法存在一個問題,那就是Runnable隻啟動一次,SeekBar也隻更新一次,也就是說沒有實作定期器的功能。是以在Runnable代碼中添加關鍵的一行:

seekHandler.postDelayed(this, 100); // Handler.postDelayed(Runnable runnable, long delayMillis) 每隔delayMillis毫秒啟動一次runnable

這行代碼使得Runnable每隔100 ms(時間可以根據自己的情況設定)。是以Runnable代碼最後為:

runnable = new Runnable() {  
    @Override  
    public void run() {  
        Message message = new Message();  
        message.what = 1;  
        seekHandler.sendMessage(message);  
        seekHandler.postDelayed(this, 100);
    }  
};  
runnable.run(); // 啟動runnable  
           

這就就實作了SeekBar的實時更新。問題解決。