自定义倒计时器

 

今天整理了一下实现计时器的常用方式,有下面几种:

排序组合方式附注
1Timer+TimerTask 
2Timer+TimerTask+Handler 
3Handler 
4Handler+Thread 
5Handler+Runnable 
6CountDownTimer官方提供的倒计时器,推荐使用。

目录

1、Timer+TimerTask

2、Timer+TimerTask+Handler

3、Handler

4、Handler+Thread

5、Handler+Runnable

6、CountDownTimer


源码

1、Timer+TimerTask


public class TimerTaskActivity extends Activity{  
 
    private int recLen = 11;  
    private TextView txtView;  
    Timer timer = new Timer();  
 
    public void onCreate(Bundle savedInstanceState){  
        super.onCreate(savedInstanceState);  
          
        setContentView(R.layout.timertask);  
        txtView = (TextView)findViewById(R.id.txttime);  
          
        timer.schedule(task, 1000, 1000);       // timeTask  
    }     
 
    TimerTask task = new TimerTask() {  
        @Override  
        public void run() {  
 
            runOnUiThread(new Runnable() {      // UI thread  
                @Override  
                public void run() {  
                    recLen--;  
                    txtView.setText(""+recLen + "s");  
                    if(recLen < 0){  
                        timer.cancel();  
                        txtView.setVisibility(View.GONE);  
                    }  
                }  
            });  
        }  
    };  
}  

2、Timer+TimerTask+Handler

public class timerTaskHandlerActivity extends Activity{  
    private int recLen = 11;  
    private TextView txtView;  
    Timer timer = new Timer();  
 
    public void onCreate(Bundle savedInstanceState){  
        super.onCreate(savedInstanceState);  
 
        setContentView(R.layout.timertask);  
        txtView = (TextView)findViewById(R.id.txttime);  
 
        timer.schedule(task, 1000, 1000);       // timeTask  
    }     
 
    final Handler handler = new Handler(){  
        @Override  
        public void handleMessage(Message msg){  
            switch (msg.what) {  
            case 1:  
                txtView.setText(""+recLen);  
                if(recLen < 0){  
                    timer.cancel();  
                    txtView.setVisibility(View.GONE);  
                }  
            }  
        }  
    };  
 
    TimerTask task = new TimerTask() {  
        @Override  
        public void run() {  
            recLen--;  
            Message message = new Message();  
            message.what = 1;  
            handler.sendMessage(message);  
        }  
    };  
}

3、Handler


public class HandlerActivity extends Activity{  
    private int recLen = 11;  
    private TextView txtView;  
 
    public void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);    
 
        setContentView(R.layout.timertask);   
        txtView = (TextView)findViewById(R.id.txttime);  
 
        Message message = handler.obtainMessage(1);     // Message  
        handler.sendMessageDelayed(message, 1000);  
    }    
 
    final Handler handler = new Handler(){  
 
        public void handleMessage(Message msg){         // handle message  
            switch (msg.what) {  
            case 1:  
                recLen--;  
                txtView.setText("" + recLen);  
 
                if(recLen > 0){  
                    Message message = handler.obtainMessage(1);  
                    handler.sendMessageDelayed(message, 1000);      // send message  
                }else{  
                    txtView.setVisibility(View.GONE);  
                }  
            }  
 
            super.handleMessage(msg);  
        }  
    };  
} 

4、Handler+Thread

public class ThreadHandlerActivity extends Activity{  
    private int recLen = 0;  
    private TextView txtView;  
 
    public void onCreate(Bundle savedInstanceState){  
        super.onCreate(savedInstanceState);  
 
        setContentView(R.layout.timertask);  
        txtView = (TextView)findViewById(R.id.txttime);  
          
        new Thread(new MyThread()).start();         // start thread  
    }     
 
    final Handler handler = new Handler(){          // handle  
        public void handleMessage(Message msg){  
            switch (msg.what) {  
            case 1:  
                recLen++;  
                txtView.setText("" + recLen);  
            }  
            super.handleMessage(msg);  
        }  
    };  
 
    public class MyThread implements Runnable{      // thread  
        @Override  
        public void run(){  
            while(true){  
                try{  
                    Thread.sleep(1000);     // sleep 1000ms  
                    Message message = new Message();  
                    message.what = 1;  
                    handler.sendMessage(message);  
                }catch (Exception e) {  
                } 
            }
        }
    }
}

5、Handler+Runnable

public class RunnableHandlerActivity extends Activity{  
    private int recLen = 0;  
    private TextView txtView;  
 
    public void onCreate(Bundle savedInstanceState){  
        super.onCreate(savedInstanceState);  
 
        setContentView(R.layout.timertask);  
        txtView = (TextView)findViewById(R.id.txttime);  
          
        handler.postDelayed(runnable, 1000);  
    }     
 
    Handler handler = new Handler();  
    Runnable runnable = new Runnable() {  
        @Override  
        public void run() {  
            runOnUiThread(new Runnable() {      // UI thread  
                @Override  
                public void run() {  
                    recLen++;  
                    txtView.setText("" + recLen);  
                    handler.postDelayed(this, 1000); 
                }  
            });  
        }  
    };  
} 

6、CountDownTimer

TimeCount.java:(PS:直接复制到你的项目中即可)

public class TimeCount extends CountDownTimer {
    public static final int SHOW_DETAIL = 0;//HH:mm:ss
    public static final int SHOW_NORMAL = 1;//ss
    private SimpleDateFormat detailsf = new SimpleDateFormat("HH:mm:ss");
    private TextView timerText;
    private Context context;
    private boolean onTick = false;
    private int type;
    private TextView textButton;

    /**
     * @params millisInFuture 计时总时长(单位毫秒)
     * @params countDownInterval 计时间隔(单位毫秒)
     * @params timerText 显示计时信息的textView
     * @params type 指定显示样式:“ss”或者“HH:mm:ss”
     */
    public TimeCount(Context context, long millisInFuture, long countDownInterval, TextView timerText, int type) {
        super(millisInFuture, countDownInterval);//参数依次为总时长,和计时的时间间隔
        this.timerText = timerText;
        this.context = context;
        this.type = type;
        if(type == SHOW_DETAIL){
            detailsf.setTimeZone(TimeZone.getTimeZone("UTC"));
        }
    }

    public TimeCount changeButtonStatus(TextView textButton) {
        this.textButton = textButton;
        return this;
    }

    @Override
    public void onFinish() {//计时完毕时触发
        if (textButton == null) {
            if (onTick) {
                timerText.setText("重新发送");
                timerText.setEnabled(true);
                onTick = false;
            }
        } else {
            if (!textButton.isEnabled())
                textButton.setEnabled(true);
        }
    }

    @Override
    public void onTick(long millisUntilFinished) {//计时过程显示
        String str = null;
        switch (type) {
            case SHOW_DETAIL:
                Date date = new Date(millisUntilFinished);
                str = detailsf.format(date);
                break;
            case SHOW_NORMAL:
                timerText.setEnabled(false);
                str = millisUntilFinished / 1000 + "s";
                break;
        }
        onTick = true;
        timerText.setText(str);
    }

    public boolean isOnTick() {
        return onTick;
    }

}

TickActivity.java:

public class TickActivity extends AppCompatActivity {
    private TextView getCode;
    private TextView dateLimit;

    private TimeCount timer;//计时器
    private TimeCount timer2;//计时器

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tick);
        initWidget();
        initTicker();
    }

    //初始化控件
    private void initWidget(){
        getCode = findViewById(R.id.getCode);
        dateLimit = findViewById(R.id.dateLimit);

        getCode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                timer.start();//计时器开始计时
                /*发起网络请求获取短信*/
            }
        });
    }

    //初始化计时器
    private void initTicker(){
        /*为了演示,此处定义时限为10s*/
        timer = new TimeCount(this, 10000, 1000, getCode, TimeCount.SHOW_NORMAL);

        /*活动倒计时1天*/
        timer2 = new TimeCount(this, 86400000, 1000, dateLimit, TimeCount.SHOW_DETAIL);
        timer2.start();//计时器开始计时
    }

    /*停止计时*/
    public void stopTimer(){
        if(timer.isOnTick())
            timer.onFinish();
        if(timer2.isOnTick())
            timer2.onFinish();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        stopTimer();
    }

}

运行效果:

 

感谢网友分享:https://blog.csdn.net/lanxingfeifei/article/details/51769740 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值