欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android获取验证码倒计时显示效果

程序员文章站 2024-03-04 15:53:29
前面为大家讲过计时器的顺时针的两种方法,在录制视频等操作中颇有使用,今天就给大家带来倒计时实现的两种方式。 虽然最近写的都比较简单和基础,不过简单不代表熟悉,基础不代表就...

前面为大家讲过计时器的顺时针的两种方法,在录制视频等操作中颇有使用,今天就给大家带来倒计时实现的两种方式。

虽然最近写的都比较简单和基础,不过简单不代表熟悉,基础不代表就会,大牛绕过,哈,中牛小牛也可以绕过,这个是写给初学者的。

先搞个效果图。

Android获取验证码倒计时显示效果

代码实现方式也超级简单啦,这里首推第一种实现方式,而且也是比较适合大家的,就是通过直接继承countdowntimer来实现。

对于countdowntimer这个类很简单,继承它的时候必须重写构造方法和实现其虚拟方法。

构造方法的两个参数分别是(倒计时开始时间,间隔时间)

另外两个方法分别是ontick(现在还剩的时间),计时结束后你想做的时间可以在onfinish()中做。

值的注意的是,所有的时间都是以毫秒形式来做的,所以在你使用的时候要记得整除1000取商。

不过由于我使用的是私有内部类的方式对外部类存在引用,为了防止内存泄漏,在activity销毁的时候应该注意对其置空,同样我们也应该避免重复创建对象。

另外一种方式还是使用我们常用的handler + thread的方式来实现。不过实现的时候同样要非常小心内存泄漏,因为如果用户在销毁activity的时候应该注意让其计时子线程不再循环,这个可以通过设置一个tag标签对其判断。

这样在销毁的时候把这个tag标签置为false,结束线程的执行!

下面是实现代码:

package com.example.nanchen.timerdemo;

import android.os.bundle;
import android.os.countdowntimer;
import android.os.handler;
import android.os.message;
import android.support.v7.app.appcompatactivity;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;

public class mainactivity extends appcompatactivity {

 private button mbtngetcode;
 private timecount mtimecount;
 private button mbtngetcode2;
 private boolean timeflag = true;

 @override
 protected void oncreate(bundle savedinstancestate) {
 super.oncreate(savedinstancestate);
 setcontentview(r.layout.activity_main);

 mbtngetcode = (button) findviewbyid(r.id.main_btn_get_code);
 mbtngetcode.setonclicklistener(new onclicklistener() {
  @override
  public void onclick(view v) {
  mtimecount = null;
  mtimecount = new timecount(60 * 1000, 1000);
  mtimecount.start();
  }
 });

 mbtngetcode2 = (button) findviewbyid(r.id.main_btn_get_code_2);
 mbtngetcode2.setonclicklistener(new onclicklistener() {
  @override
  public void onclick(view v) {
  mbtngetcode2.setclickable(false);
  mbtngetcode2.setbackgroundcolor(getresources().getcolor(r.color.btn_unable));
  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) {
  mbtngetcode2.settext("(" + msg.what + ")秒后重试");
  } else {
  mbtngetcode2.settext("获取验证码");
  mbtngetcode2.setclickable(true);
  mbtngetcode2.setbackgroundcolor(getresources().getcolor(r.color.coloraccent));
  }
 }


 };


 /**
 * activity 销毁的时候注意把所有引用置为空,防止内存泄漏
 */
 @override
 protected void ondestroy() {
 super.ondestroy();
 mtimecount = null;
 timeflag = false;
 }

 /**
 * 实现倒计时的类
 */
 private class timecount extends countdowntimer {

 /**
  * @param millisinfuture the number of millis in the future from the call
  *    to {@link #start()} until the countdown is done and {@link #onfinish()}
  *    is called.
  * @param countdowninterval the interval along the way to receive
  *    {@link #ontick(long)} callbacks.
  */
 public timecount(long millisinfuture, long countdowninterval) {
  super(millisinfuture, countdowninterval);
 }

 /**
  * 计时过程显示 按钮不可用 设置为灰色
  *
  * @param millisuntilfinished
  */
 @override
 public void ontick(long millisuntilfinished) {
  mbtngetcode.setclickable(false);
  mbtngetcode.setbackgroundcolor(getresources().getcolor(r.color.btn_unable));
  mbtngetcode.settext("(" + millisuntilfinished / 1000 + ")秒后重试");
 }

 /**
  * 计时结束调用
  */
 @override
 public void onfinish() {
  mbtngetcode.setclickable(true);
  mbtngetcode.settext("获取验证码方式1");
  mbtngetcode.setbackgroundcolor(getresources().getcolor(r.color.colorprimarydark));
 }
 }


}

简单看一下xml文件

<?xml version="1.0" encoding="utf-8"?>
<relativelayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/activity_main"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="com.example.nanchen.timerdemo.mainactivity">

 <button
 android:layout_margintop="10dp"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:id="@+id/main_btn_get_code"
 android:text="获取验证码方式1"
 android:background="@color/colorprimarydark"/>

 <textview
 android:layout_width="match_parent"
 android:layout_height="1dp"
 android:id="@+id/main_line1"
 android:background="@color/btn_unable"
 android:layout_below="@+id/main_btn_get_code"
 android:layout_margintop="10dp"/>

 <button
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_below="@+id/main_line1"
 android:layout_margintop="10dp"
 android:text="获取验证码方式2"
 android:id="@+id/main_btn_get_code_2"
 android:background="@color/coloraccent"/>

</relativelayout>

写在最后:虽然代码和实现都非常简单,你可能不费吹灰之力,不过倘若转载的话,还是留个本文链接吧~thank you!

github链接:https://github.com/nanchen2251/timerdemo

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。