android使用CountDownTimer获取验证码

CountDownTimer

项目中经常用到倒计时的功能,比如说限时抢购,手机获取验证码等等。而google官方也帮我们封装好了一个类:CountDownTimer,使我们的开发更加方便。

CountDownTimer是一个抽象类,有两个抽象方法,它的API很简单

public abstract void onTick(long millisUntilFinished);//这个是每次间隔指定时间的回调,millisUntilFinished:剩余的时间,单位毫秒
public abstract void onFinish();//这个是倒计时结束的回调

获取验证码按钮布局

<TextView
        android:id="@+id/tv_get_verifycode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50dp"
        android:layout_marginTop="50dp"
        android:background="@drawable/selector_get_verify_code_bg"
        android:enabled="true"
        android:gravity="center"
        android:padding="8dp"
        android:text="获取验证码"
        android:textColor="@color/selector_color_get_verify_code"
        android:textSize="14sp" />

selector_color_get_verify_code.xml


<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:color="#ffffff" android:state_enabled="true"/>
    <item android:color="#333333" android:state_enabled="false"/>

selector>

shape_get_verify_code_enable.xml


<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid android:color="#ff4415" />
    <corners android:radius="10dp" />

shape>

shape_get_verify_no_enable.xml


<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid android:color="#d9d9d9" />
    <corners android:radius="10dp" />

shape>

selector_get_verify_code_bg.xml


<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/shape_get_verify_code_enable" android:state_enabled="true"/>
    <item android:drawable="@drawable/shape_get_verify_no_enable" android:state_enabled="false"/>

selector>

CountDownTimeUtil

/**
 * Cerated by xiaoyehai
 * Create date : 2019/11/11 19:16
 * description :
 */
public class CountDownTimeUtil {

    private WeakReference<TextView> tvCodeWr;//控件软引用,防止内存泄漏
    private CountDownTimer timer;


    public CountDownTimeUtil(TextView tvCode) {
        super();
        this.tvCodeWr = new WeakReference(tvCode);
    }

    public void runTimer() {
        //倒计时的总时长   每次的间隔时间   单位都是毫秒
        timer = new CountDownTimer(60 * 1000 - 1, 1000) {

            /**
             * 这个是倒计时结束的回调
             */
            @Override
            public void onFinish() {
                if (tvCodeWr.get() != null) {
                    tvCodeWr.get().setClickable(true);
                    tvCodeWr.get().setEnabled(true);
                    tvCodeWr.get().setText("获取验证码");
                }
                cancel();
            }

            /**
             * 这个是每次间隔指定时间的回调
             *
             * @param millisUntilFinished 剩余的时间,单位毫秒
             */
            @Override
            public void onTick(long millisUntilFinished) {
                if (tvCodeWr.get() != null) {
                    tvCodeWr.get().setClickable(false);
                    tvCodeWr.get().setEnabled(false);
                    tvCodeWr.get().setText(millisUntilFinished / 1000 + "s后重新获取");
                }
            }
        }.start();
    }

    /**
     * 这个方法可以在activity或者fragment销毁的时候调用,防止内存泄漏
     * 如果在activity或者fragment关闭销毁的时候没有调用cancle方法,它的onTick方法还是会继续执行,这个时候UI控件都为空,不注意判断的话很容易空指针
     */
    public void cancel() {
        if (timer != null) {
            timer.onFinish();
            timer.cancel();
            timer = null;
        }
    }
}

在Activity中使用

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


        mTvGetVerifyCode = (TextView) findViewById(R.id.tv_get_verifycode);

        mTvGetVerifyCode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mCountDownTimeUtil = new CountDownTimeUtil(mTvGetVerifyCode);
                mCountDownTimeUtil.runTimer();
            }
        });
    }

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

        if (mCountDownTimeUtil != null) {
            mCountDownTimeUtil.cancel();
        }
    }

你可能感兴趣的:(android)