Timer实现定时执行

时间:2022-10-13 20:41:00


原文地址:Timer实现定时执行

原文地址:Android图片滚动,加入自动播放功能,使用自定义属性实现,霸气十足!


3秒后执行:

Timer timer = new Timer();  
timer.schedule(new TimerTask()
{

@Override
public void run()
{
//执行的内容
}

}, 3000);//表示3秒后执行


0表示立即执行,2000表示每隔两秒执行一次  
Timer timer = new Timer();  
timer.schedule(new TimerTask()
{

@Override
public void run()
{
//执行的内容
}

}, 0, 2000);//0表示立即执行,2000表示每隔两秒执行一次

注意,执行的内容中不能直接对界面上的元素进行操作,也就是说,不能直接去访问UI thread。


那现在举一个可以在定时器中更新UI的例子:

用的是Handler的post方法:

/** 
* 用于在定时器当中操作UI界面。
*/
private Handler handler = new Handler();

/**
* 开启图片自动播放功能,当滚动到最后一张图片的时候,会自动回滚到第一张图片。
*/
public void startAutoPlay() {
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if (currentItemIndex == itemsCount - 1) {
currentItemIndex = 0;
handler.post(new Runnable() {
@Override
public void run() {
scrollToFirstItem();
refreshDotsLayout();
}
});
} else {
currentItemIndex++;
handler.post(new Runnable() {
@Override
public void run() {
scrollToNext();
refreshDotsLayout();
}
});
}
}
}, 3000, 3000);
}
我们可以看到,这个方法里启用了一个定时器,每隔三秒就会执行一次。然后在定时器的执行逻辑里面进行判断当前图片是否是最后一张,如果不是最后一张就滚动到下一张图片,如果是最后一张就回滚到第一张图片。其中需要注意,定时器中的代码是在子线程中运行的,而滚动图片操作和更新页签操作都是UI操作,因此需要放到Handler中去执行。


我们这里再写一个不需要用Timer但又可以实现定时和更改UI的例子:

如果想要更新UI可以使用view.postDelayed这个很实用的方法:中间那个线程执行一次需要1秒,在它的内部又通过递归的方法来实现多次调用,由currentSeconds来控制递归次数,共60次,实现60秒的倒计时功能。

int currentSeconds = 60;  
/**
* 记录时间
* */
private void startTimer(final TextView btnForgetPassword) {

this.getWindow().getDecorView().postDelayed(new Runnable() {
@Override
public void run() {
currentSeconds--;
if (currentSeconds > 0) {
btnForgetPassword.setText(String.format("取回密码(%d)", currentSeconds));
startTimer(btnForgetPassword);//递归
} else {
btnForgetPassword.setText("取回密码");
btnForgetPassword.setEnabled(true);
}
}
}, 1000);
}
上面实现的是TextView的60秒倒计时功能。