Android开发之两种方法实现倒计时获取验证码

Android开发之两种方法实现倒计时获取验证码


布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/main_btn1"
        android:layout_marginTop="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="(CountDownTimer)获取验证码①"
        android:textAllCaps="false"
        android:background="@color/colorAccent"/>

    <Button
        android:id="@+id/main_btn2"
        android:layout_marginTop="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="(Handler)获取验证码②"
        android:textAllCaps="false"
        android:background="@color/colorAccent"/>

</LinearLayout>

颜色colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>

    <color name="unable_click">#5b5d5c</color>
</resources>

MainActivity.java

import android.os.CountDownTimer;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private Button main_btn1, main_btn2;

    private TimeCount mTimeCount;

    private boolean timeFlag = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        main_btn1 = (Button) findViewById(R.id.main_btn1);
        main_btn2 = (Button) findViewById(R.id.main_btn2);

        //方式1
        //推荐使用方式1
        main_btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mTimeCount = null;
                mTimeCount = new TimeCount(60 * 1000, 1000);
                mTimeCount.start();

            }
        });

        //方式2
        main_btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                main_btn2.setClickable(false);
                main_btn2.setBackgroundColor(getResources().getColor(R.color.unable_click));
                timeFlag = true;
                new Thread() {
                    @Override
                    public void run() {
                        super.run();
                        for (int i = 59; i >= 0 && timeFlag; i--) {
                            try {
                                sleep(1000);
                                Message msg = Message.obtain();
                                msg.what = i;
                                mHandler.sendMessage(msg);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }.start();
            }
        });
    }

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what > 0) {
                main_btn2.setText("(" + msg.what + ")秒后重试");
            } else {
                main_btn2.setText("(Handler)获取验证码");
                main_btn2.setClickable(true);
                main_btn2.setBackgroundColor(getResources().getColor(R.color.colorAccent));
            }
        }
    };

    /**
     * removeCallbacksAndMessages移除消息队列中所有消息(/所有的Runnable/)
     * Activity destroy的时候注意把所有引用置为空,防止发生内存泄漏
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mHandler.removeCallbacksAndMessages(null);
        mHandler=null;
        mTimeCount = null;
        timeFlag = false;
    }


    /**
     * 实现倒计时的内部类
     */
    private class TimeCount extends CountDownTimer {

        /**
         * 两个参数分别是(倒计时开始时间,间隔时间)
         */
        public TimeCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        /**
         * 计时过程显示 按钮不可用 设置为灰色
         *
         * @param millisUntilFinished
         */
        @Override
        public void onTick(long millisUntilFinished) {
            main_btn1.setClickable(false);
            main_btn1.setBackgroundColor(getResources().getColor(R.color.unable_click));
            main_btn1.setText("(" + millisUntilFinished / 1000 + ")秒后重试");
        }

        /**
         * 计时结束调用, 计时结束后执行的事件可以在onFinish()中做
         * 另外一个方法是onTick(现在还剩的时间),。
         */
        @Override
        public void onFinish() {
            main_btn1.setClickable(true);
            main_btn1.setText("(CountDownTimer)获取验证码");
            main_btn1.setBackgroundColor(getResources().getColor(R.color.colorAccent));
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值