博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
获取验证码显示的两种简单实现,交互绝非偶然~
阅读量:6545 次
发布时间:2019-06-24

本文共 5287 字,大约阅读时间需要 17 分钟。

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

对面前面的正向计时方法没有了解的,可以直接传送门:

 

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

先搞个效果图。

 

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

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

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

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

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

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

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

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

 

下面是实现代码:

1 package com.example.nanchen.timerdemo;  2   3 import android.os.Bundle;  4 import android.os.CountDownTimer;  5 import android.os.Handler;  6 import android.os.Message;  7 import android.support.v7.app.AppCompatActivity;  8 import android.view.View;  9 import android.view.View.OnClickListener; 10 import android.widget.Button; 11  12 public class MainActivity extends AppCompatActivity { 13  14     private Button mBtnGetCode; 15     private TimeCount mTimeCount; 16     private Button mBtnGetCode2; 17     private boolean timeFlag = true; 18  19     @Override 20     protected void onCreate(Bundle savedInstanceState) { 21         super.onCreate(savedInstanceState); 22         setContentView(R.layout.activity_main); 23  24         mBtnGetCode = (Button) findViewById(R.id.main_btn_get_code); 25         mBtnGetCode.setOnClickListener(new OnClickListener() { 26             @Override 27             public void onClick(View v) { 28                 mTimeCount = null; 29                 mTimeCount = new TimeCount(60 * 1000, 1000); 30                 mTimeCount.start(); 31             } 32         }); 33  34         mBtnGetCode2 = (Button) findViewById(R.id.main_btn_get_code_2); 35         mBtnGetCode2.setOnClickListener(new OnClickListener() { 36             @Override 37             public void onClick(View v) { 38                 mBtnGetCode2.setClickable(false); 39                 mBtnGetCode2.setBackgroundColor(getResources().getColor(R.color.btn_unable)); 40                 timeFlag = true; 41                 new Thread() { 42                     @Override 43                     public void run() { 44                         super.run(); 45                         for (int i = 59; i >= 0 && timeFlag; i--) { 46                             try { 47                                 sleep(1000); 48                                 Message msg = Message.obtain(); 49                                 msg.what = i; 50                                 mHandler.sendMessage(msg); 51                             } catch (InterruptedException e) { 52                                 e.printStackTrace(); 53                             } 54                         } 55                     } 56                 }.start(); 57             } 58         }); 59     } 60  61     private Handler mHandler = new Handler() { 62         @Override 63         public void handleMessage(Message msg) { 64             super.handleMessage(msg); 65             if (msg.what > 0) { 66                 mBtnGetCode2.setText("(" + msg.what + ")秒后重试"); 67             } else { 68                 mBtnGetCode2.setText("获取验证码"); 69                 mBtnGetCode2.setClickable(true); 70                 mBtnGetCode2.setBackgroundColor(getResources().getColor(R.color.colorAccent)); 71             } 72         } 73  74  75     }; 76  77  78     /** 79      * Activity 销毁的时候注意把所有引用置为空,防止内存泄漏 80      */ 81     @Override 82     protected void onDestroy() { 83         super.onDestroy(); 84         mTimeCount = null; 85         timeFlag = false; 86     } 87  88     /** 89      * 实现倒计时的类 90      */ 91     private class TimeCount extends CountDownTimer { 92  93         /** 94          * @param millisInFuture    The number of millis in the future from the call 95          *                          to {
@link #start()} until the countdown is done and {
@link #onFinish()} 96 * is called. 97 * @param countDownInterval The interval along the way to receive 98 * {
@link #onTick(long)} callbacks. 99 */100 public TimeCount(long millisInFuture, long countDownInterval) {101 super(millisInFuture, countDownInterval);102 }103 104 /**105 * 计时过程显示 按钮不可用 设置为灰色106 *107 * @param millisUntilFinished108 */109 @Override110 public void onTick(long millisUntilFinished) {111 mBtnGetCode.setClickable(false);112 mBtnGetCode.setBackgroundColor(getResources().getColor(R.color.btn_unable));113 mBtnGetCode.setText("(" + millisUntilFinished / 1000 + ")秒后重试");114 }115 116 /**117 * 计时结束调用118 */119 @Override120 public void onFinish() {121 mBtnGetCode.setClickable(true);122 mBtnGetCode.setText("获取验证码方式1");123 mBtnGetCode.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));124 }125 }126 127 128 }

 

简单看一下xml文件

1 
2
9 10
17 18
25 26
34 35

 

 

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

github链接:

本文原创链接:

 

你可能感兴趣的文章
OpenGL学习(二)用户与交互
查看>>
神奇的代码-常见错误代码注意点
查看>>
[直播一揽子]编码构思和套路
查看>>
[直播一揽子]x264参数的解释
查看>>
static的意义和功能
查看>>
iOS学习之Objective-C 2.0 运行时系统编程
查看>>
Exchange2007-Exchange2010升级-06 数据库高可用组的创建
查看>>
phpHiveAdmin是如何通过Hive/Hadoop工作的
查看>>
双向链表内结点的删除(4)
查看>>
项目总结
查看>>
JSON字符串转成对象
查看>>
SaltStack 中ZMQ升级
查看>>
grep,egrep使用以及正则表达式的使用
查看>>
implode 和 explode
查看>>
gzip the js and css
查看>>
exchange 2013 提示“HTTP 500内部服务器错误”
查看>>
Linux运维学习笔记之一:运维的原则和学习方法
查看>>
怎样使用原型设计中的组件样式功能
查看>>
python threading
查看>>
谷安天下2013年6月CISA考前辅导 第一季
查看>>