今天在學習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的實時更新。問題解決。