关闭

倒计时计时器

199人阅读 评论(0) 收藏 举报
分类:

倒计时计时器很常用的一个场景是在发送验证码时,往往需要设计倒计时来给用户再次发送验证码,在某一段时间间隔之中,用户不允许对按钮进行再次点击或其他操作。
具体实现如下:
1-自定义一个接口,用来在接受对应方法中传来的相关控件

/**
 * 返回定时器相关控件的接口
 */
public interface ITimerUtilListener {
    public void getTimer(Timer timer,Handler handler,TimerTask task);
}

2-创建TimerUtil类,执行计时器的具体方法

public class TimerUtil {
    private Timer timer;
    private Handler handler;
    private TimerTask task;
    private TextView tv;
    private int i;
    public TimerUtil(final TextView tv) {
        this.tv = tv;
        handler = new Handler() {  
            public void handleMessage(Message msg) {  
                if (msg.what == 2) {
                    if(i>=0){
                        tv.setText("等待"+Integer.toString(--i)+"秒"); 
                        if(i == 0){
                            timer.cancel();
                            timer = null;
                            task = null;
                            tv.setEnabled(true);
                            tv.setText("重新发送验证码"); 

                        }
                    }else{
                        return;
                    }
                } else {
                    //这里相当于接受msg.what == 1时的处理
                    if(i>=0){
                        tv.setText("等"+Integer.toString(--i)+"分"); 
                        if(i == 0){
                            timer.cancel();
                            timer = null;
                            task = null;
                            tv.setEnabled(true);
                            tv.setText("重新发送验证码2"); 

                        }
                    }
                } 
                super.handleMessage(msg);  
            };  
        };  
    }

    /**
     * 设置验证码计时器
     */
    public void setMessageCodeTimeTask(final Context context,
            ITimerUtilListener listen) {
        tv.setEnabled(false);
        if(timer == null){
            timer = new Timer();
        }
        i = 10;
        if(task == null){
            task = new TimerTask() {  

                @Override  
                public void run() {  
                    // 需要做的事:发送消息  
                    Message message = new Message();  
                    message.what = 2;  
                    handler.sendMessage(message);  
                }  
            };
        }
        if(timer != null && task != null){
            timer.schedule(task, 1000, 1000); // 1s后执行task,经过1s再次执行  
        }
        listen.getTimer(timer,handler,task);
    }

    public void setMessageCodeTimeTask2(final Context context,
            ITimerUtilListener listen) {
        tv.setEnabled(false);
        if(timer == null){
            timer = new Timer();
        }
        i = 10;
        if(task == null){
            task = new TimerTask() {  

                @Override  
                public void run() {  
                    // 需要做的事:发送消息  
                    Message message = new Message();  
                    message.what = 1;  
                    handler.sendMessage(message);  
                }  
            };
        }
        if(timer != null && task != null){
            timer.schedule(task, 1000, 1000); // 1s后执行task,经过1s再次执行  
        }
        listen.getTimer(timer,handler,task);
    }


}

3-MainActivity 中创建相应的TextView或继承自TextView的控件(如Button),在控件的点击事件中执行TimerUtil类中的方法,并将ITimerUtilListener接口中的控件传回,赋给MainActivity中的控件。
PS:TimerUtil 类中参数可以自定义传入其他控件,而不仅仅局限于传TextView。因此处的TimerUtil 类传入的是TextView,故必须传入TextView相关的控件。

public class MainActivity extends Activity {

    TextView tv_timerTest;
    Button btn_click;
    Timer timer;
    Handler handler;
    TimerTask task; 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_timerTest = (TextView) findViewById(R.id.tv_timerTest);
        btn_click = (Button) findViewById(R.id.btn_click);


    }
    @Override
    protected void onResume() {
        tv_timerTest.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //实现点击倒计时
                TimerUtil util = new TimerUtil(tv_timerTest);
                util.setMessageCodeTimeTask( 
                        MainActivity.this,new ITimerUtilListener() {

                    @Override
                    public void getTimer(Timer timer,Handler handler,TimerTask task) {
                        MainActivity.this.timer = timer;
                        MainActivity.this.handler = handler;
                        MainActivity.this.task = task;
                    }
                });             
            }
        });
        btn_click.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //实现点击倒计时
                TimerUtil util = new TimerUtil(btn_click);
                util.setMessageCodeTimeTask2( 
                        MainActivity.this,new ITimerUtilListener() {

                    @Override
                    public void getTimer(Timer timer,Handler handler,TimerTask task) {
                        MainActivity.this.timer = timer;
                        MainActivity.this.handler = handler;
                        MainActivity.this.task = task;
                    }
                }); 
            }
        });

        super.onResume();
    }

}
0
0
查看评论

计时器---倒计时功能的实现

问题的实现描述:首先设置倒计时的时间,通过UIDatePicker来制定倒计时的时长,点击“确定”按钮,跳转到倒计时页面,同时将UIDatePicker定义的时间传到新push的页面的上方label位置,点击“开始”按钮,开始倒计时,这期间可以点击“暂停/继续”按钮 来控制倒计时时间的停止和继续,...
  • qq_27364431
  • qq_27364431
  • 2015-06-08 16:23
  • 1005

Java:多种方式实现倒计时定时器

多种方式实现倒计时定时器 github链接:https://github.com/Al-assad/Java-Gadgets/tree/master/count_down 1、简易方式实现 /** * @see * @author Al_assad yulinying_1994@outloo...
  • Al_assad
  • Al_assad
  • 2016-11-01 09:31
  • 15549

RxAndroid2.0 倒计时简单封装

Rxandroid 2.0 实现倒计时功能 可以手动调用完成停止轮询
  • Tomcat_lgs
  • Tomcat_lgs
  • 2017-06-02 13:32
  • 539

WPF 计时器(支持倒计时、正计时)

using System; using System.Windows; using System.Windows.Threading; namespace WpfApplication1 {     ///     /// MainWin...
  • u014117094
  • u014117094
  • 2015-06-28 18:02
  • 4182

Java编程简单的倒计时器

JAVA编程 ,应用线程制作简单的倒计时器
  • wenjinwen1219
  • wenjinwen1219
  • 2016-08-20 16:18
  • 881

jQuery实现倒计时计时器

本文转载自 jquery 做一个小的倒计时效果 在实际运用中,经常会使用到倒计时的效果。以下代码利用jQuery实现了一个倒计时计时器。 jquery倒计时实现 .shop_list ul li{ display: inline-block; lis...
  • henouren
  • henouren
  • 2017-09-19 10:55
  • 350

递归实现倒计时

//开始倒计时     func doCoundDown(btnrengou:BFPaperButton,curtime:Int,cdIndex:Int) {              &...
  • koocui
  • koocui
  • 2017-02-24 16:10
  • 404

swift学习笔记 - swift3.0用GCD实现计时器

swift3.0之后,GCD的语法发生了翻天覆地的变化,从过去的c语法变成了点语法,下面是变化之后用GCD实现计时器的方法: 先贴代码:// 定义需要计时的时间 var timeCount = 60 // 在global线程里创建一个时间源 let codeTimer = DispatchSourc...
  • wang631106979
  • wang631106979
  • 2016-12-26 11:01
  • 7811

Android实现多个倒计时优化与源码分析

因为之前有个项目需求是需要时时刻去更新UI倒计时,之前想到的,这简单嘛,用计时或者Handler就可以搞定,而且性能也不错,但是需求要ListView,什么,?大量的View都需要,那Handle处理不好会挂的啊,那轮训呢,?太消耗内存和Cpu,突然之前只有想到用Handle去处理,但是Item太多...
  • u010316858
  • u010316858
  • 2015-08-12 10:59
  • 2437

一个非常简单的react native计时器demo

一个非常简单的react native计时器demo 因为最近在学习react native,所以自己也一边学习,一边记下自己的笔记。今天看到定时器,所以写了一个简单的计时器。 定时器: setTimeout, clearTimeoutsetInterval, clearIntervals...
  • wallowyou
  • wallowyou
  • 2017-01-11 21:01
  • 2621
    个人资料
    • 访问:25826次
    • 积分:486
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:2篇
    • 译文:4篇
    • 评论:1条
    文章分类
    最新评论