APP开发:倒计时

来源:互联网 发布:淘宝货到付款可以退吗 编辑:程序博客网 时间:2024/05/18 00:07

我们在app开发中经常遇到发送验证码后60s倒计时的操作,60s内不可点击,当0s时可以再次点击,同时TextView和计时复位为60S。

Handler实现倒计时的效果

延迟1s发送消息,接收消息后,先判断count > 0? 是:Button不可点击 + 显示时间 + count–;否:Button可点击 + count = 60 + 显示60s.

效果图

为方便观察,时间设为6s。
这里写图片描述

逻辑:

点击button发送消息,handler接收消息后,实现倒计时效果。

方法:

sendEmptyMessage (int what):  发送空消息,消息类型是whatsendEmptyMessageDelayed (int what, long delayMillis):延迟delayMillis毫秒发送空消息,消息类型是what。

代码:

package com.cqc.timecountdown;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.TextView;public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private static final int MSGWHAT = 1;    private int CountDown = 60;    private Button btn;    private TextView tv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        findViews();        initViews();    }    private void initViews() {        btn.setOnClickListener(this);    }    private void findViews() {        btn = (Button) findViewById(R.id.btn);        tv = (TextView) findViewById(R.id.tv);    }    //怎么防止重复点击    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.btn:                handler.sendEmptyMessage(MSGWHAT);                break;        }    }    private Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            Log.d("tag", "countDown=" + CountDown);            if (msg.what == MSGWHAT) {                if (CountDown >= 0) {                    btn.setEnabled(false);//防止重复点击Button,否则多次点击button:每隔一秒发送消息多次执行                    tv.setText(CountDown-- + "s");                    handler.sendEmptyMessageDelayed(MSGWHAT, 1000);                } else {                    btn.setEnabled(true);                    CountDown = 60;//复位,60s倒计时完后可以继续倒计时                    tv.setText(CountDown-- + "s");                }            }        }    };}

Thread + Handler

延迟1秒的操作用Thread.sleep(1000)来实现,其余不变。

 if (msg.what == MSGWHAT2) {//Handler + Thread 实现倒计时效果    if (CountDown >= 0) {        btn2.setEnabled(false);        tv.setText(CountDown-- + "s");        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            handler.sendEmptyMessage(MSGWHAT2);        }    } else {        btn2.setEnabled(true);        CountDown = 5;        tv.setText(CountDown-- + "s");    }}

Timer + TimerTask

Timer:定时器,方法:schedule(…):执行
TimerTask:定时任务

代码:

Timer timer = new Timer();timer.schedule(new TimerTask() {    @Override    public void run() {        runOnUiThread(new Runnable() {//ui Thread            @Override            public void run() {                if (CountDown >= 0) {                    btn3.setEnabled(false);                    tv.setText(CountDown-- + "s");                }else{                    btn3.setEnabled(true);//                                    CountDown = 5;//死循环                }            }        });    }}, 1000, 1000);//1秒后,每隔1秒改变一次

源码:https://github.com/s1168805219/TimeCountDown

0 0
原创粉丝点击