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的实时更新。问题解决。

你可能感兴趣的:(Android,学习)