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));
}
}
}