Android实现60s倒计时

本文介绍了在Android应用开发中如何实现60秒倒计时功能,以应对用户在等待验证码短信时可能遇到的问题。通过使用CountDownTimer抽象类进行倒计时,并详细解释了该类的工作原理及其关键方法:onTick、onFinish、cancel和start。此外,还提及了可替代的Timer使用方式。

做APP时有这种功能:点击发送按钮后手机会接收到验证码,但是有的时候由于短信网关故障等原因可能不能及时收到短息,所以设置一种倒计时机制,当倒计时时间结束后如果还没有收到验证码短信则可以选择重新发送验证码。


一、使用CountDownTimer这个抽象类 

CountDownTimer这个抽象类,实现了倒计时的功能。将后台线程的创建和Handler队列封装成一个方便的类调用。这个类比较简单,只有四个方法:onTick,onFinsh、cancel和start。其中前面两个是抽象方法,所以要重写一下。

import android.os.CountDownTimer;
import android.widget.Button;

import com.neusoft.geexek.timer.R;

/**
 *  点击发送按钮后手机会接收到验证码,倒计时60s
    * @ClassName: TimeCount
    * @date 2017年1月10日
 */
public class TimeCount extends CountDownTimer {

	private Button btn_count;

	public TimeCount(long millisInFuture, long countDownInterval,Button btn_count) {
		super(millisInFuture, countDownInterval);
		this.btn_count = btn_count;
	}

	@Override
	public void onTick(long millisUntilFinished) {
		btn_count.setEnabled(false);
		btn_count.setText(millisUntilFinished / 1000 + "秒");
	}
	
	@Override
	public void onFinish() {
		btn_count.setEnabled(true);
		btn_count.setText(R.string.get_verification_code);
		
	}
	
}


如果要使用倒计时功能只需要定义一个:
timeCount = new TimeCount(60000, 1000,btn);  


然后在Button点击事件中加上
timeCount.start();

倒计时还没有结束的时候我已经不需要倒计时功能了,所以需要取消倒计时功能。CountDownTimer已经帮我们准备好了,只需要调用

timeCount.cancel();
timeCount.onFinish();

cancle()用来取消倒计时,onFinish() 用来显示倒计时完成后需要做的事。如果不调用 cancle()用来取消倒计时,程序则会在倒计时完成后自动调用timeFirst.onFinish() 用来显示倒计时完成后需要做的事。


二、使用Timer


import java.util.Timer;
import java.util.TimerTask;

import android.os.Handler;
import android.os.Message;
import android.widget.Button;

public class TimeUtils {
	private int time = 60;

	private Timer timer;

	private Button btnSure;

	private String btnText;

	public TimeUtils(Button btnSure, String btnText) {
		super();
		this.btnSure = btnSure;
		this.btnText = btnText;
	}

	public void RunTimer() {
		timer = new Timer();
		TimerTask task = new TimerTask() {

			@Override
			public void run() {
				time--;
				Message msg = handler.obtainMessage();
				msg.what = 1;
				handler.sendMessage(msg);

			}
		};

		timer.schedule(task, 100, 1000);
	}

	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 1:

				if (time > 0) {
					btnSure.setEnabled(false);
					btnSure.setText(time + "秒后重新发送");
					btnSure.setTextSize(14);
				} else {
					timer.cancel();
					btnSure.setText(btnText);
					btnSure.setEnabled(true);
					btnSure.setTextSize(14);
				}

				break;

			default:
				break;
			}

		};
	};
}


相关文章:

http://blog.youkuaiyun.com/u011895534/article/details/47144495

### 实现验证码倒计时功能 为了实现Android应用中验证码倒计时功能,可以考虑使用`CountDownTimer`类。然而,此方法有一个局限性——当页面关闭后再打开时,倒计时不会继续进行[^3]。 一种改进的方式是利用`Handler`和`Runnable`组合来实现更加灵活的倒计时逻辑。这种方式允许开发者更好地管理线程以及处理UI更新等问题。下面给出了一段基于这两种组件构建的基础示例代码: ```java // 定义全局变量用于存储剩余数 private int countdownSeconds; // 创建 Handler 对象以便于发送消息给主线程 private final Handler handler = new Handler(); // 设置初始时间为60s countdownSeconds = 60; public void startCountdown() { // 启动定时器任务 runnable.run(); } private final Runnable runnable = new Runnable() { @Override public void run() { if (countdownSeconds > 0) { // 更新按钮文字显示当前剩余时间 button.setText(String.format("%d s", countdownSeconds)); // 减少一并延迟一钟后再次执行本函数 countdownSeconds--; handler.postDelayed(this, 1000); } else { // 当倒计时结束时恢复按钮默认状态 resetButtonState(); } } }; private void resetButtonState(){ // 清除任何挂起的消息或运行的任务 handler.removeCallbacks(runnable); // 将按钮重置为其原始文本和其他属性 button.setEnabled(true); button.setText("获取验证码"); } ``` 上述代码展示了如何通过自定义`runnable`对象配合`handler`来进行每一次的操作,从而达到模拟倒计时的效果。此外,还提供了在倒计时期间禁用按钮点击事件的功能,并且可以在倒计时结束后自动恢复正常状态[^4]。 对于希望即使在Activity销毁的情况下也能保持倒计时不被中断的需求,则可能需要借助其他机制如Service服务或者SharedPreferences保存数据等方式进一步优化解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值