Timer实现定时执行


原文地址: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秒倒计时功能。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值