Android獲取驗證碼倒計時顯示效果
前面為大家講過計時器的順時針的兩種方法,在錄制視頻等操作中頗有使用,今天就給大家?guī)淼褂嫊r實現(xiàn)的兩種方式。
雖然最近寫的都比較簡單和基礎,不過簡單不代表熟悉,基礎不代表就會,大牛繞過,哈,中牛小牛也可以繞過,這個是寫給初學者的。
先搞個效果圖。

代碼實現(xiàn)方式也超級簡單啦,這里首推第一種實現(xiàn)方式,而且也是比較適合大家的,就是通過直接繼承CountDownTimer來實現(xiàn)。
對于CountDownTimer這個類很簡單,繼承它的時候必須重寫構造方法和實現(xiàn)其虛擬方法。
構造方法的兩個參數(shù)分別是(倒計時開始時間,間隔時間)
另外兩個方法分別是onTick(現(xiàn)在還剩的時間),計時結束后你想做的時間可以在onFinish()中做。
值的注意的是,所有的時間都是以毫秒形式來做的,所以在你使用的時候要記得整除1000取商。
不過由于我使用的是私有內部類的方式對外部類存在引用,為了防止內存泄漏,在Activity銷毀的時候應該注意對其置空,同樣我們也應該避免重復創(chuàng)建對象。
另外一種方式還是使用我們常用的Handler + Thread的方式來實現(xiàn)。不過實現(xiàn)的時候同樣要非常小心內存泄漏,因為如果用戶在銷毀Activity的時候應該注意讓其計時子線程不再循環(huán),這個可以通過設置一個tag標簽對其判斷。
這樣在銷毀的時候把這個tag標簽置為false,結束線程的執(zhí)行!
下面是實現(xiàn)代碼:
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;
}
/**
* 實現(xiàn)倒計時的類
*/
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>
寫在最后:雖然代碼和實現(xiàn)都非常簡單,你可能不費吹灰之力,不過倘若轉載的話,還是留個本文鏈接吧~thank you!
github鏈接:https://github.com/nanchen2251/TimerDemo
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Android賬號注冊實現(xiàn)點擊獲取驗證碼倒計時效果
- Android實現(xiàn)點擊獲取驗證碼倒計時效果
- Android開發(fā)之獲取短信驗證碼后按鈕背景變化并且出現(xiàn)倒計時
- Android實現(xiàn)發(fā)送短信驗證碼倒計時功能示例
- Android短信驗證碼倒計時驗證的2種常用方式
- Android利用CountDownTimer實現(xiàn)驗證碼倒計時效果實例
- Android自定義View獲取注冊驗證碼倒計時按鈕
- Android使用Kotlin和RxJava 2.×實現(xiàn)短信驗證碼倒計時效果
- Android 用RxBinding與RxJava2實現(xiàn)短信驗證碼倒計時功能
- Android獲取驗證碼倒計時實現(xiàn)代碼
相關文章
Android實現(xiàn)省市區(qū)三級聯(lián)動
這篇文章主要為大家詳細介紹了Android實現(xiàn)省市區(qū)三級聯(lián)動,Spinner實現(xiàn)省市區(qū)的三級聯(lián)動,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07
Android動態(tài)修改ToolBar的Menu菜單示例
本篇文章主要介紹了Android動態(tài)修改ToolBar的Menu菜單示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
Android中AutoCompleteTextView自動提示
這篇文章主要為大家詳細介紹了Android中AutoCompleteTextView自動提示的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
Android中Android Virtual Device(AVD)使用教程
這篇文章主要介紹了Android中Android Virtual Device(AVD)使用教程,本文還對使用過程中發(fā)生的一些錯誤給出了處理方法,需要的朋友可以參考下2015-01-01

