短信发送倒计时按钮封装,退出再进入可继续倒计时,绝对时间倒计时

た 入场券 2024-02-18 16:15 132阅读 0赞

先上图:

SouthEast

主要类的代码:

  1. /**
  2. * 用在获取短信验证码倒计时使用
  3. */
  4. public class SMSCodeUtil{
  5. private TimerUtil tUtil;
  6. private int time;//倒计时时间
  7. private int past_time;//已经过去了的时间
  8. private int leave_time;//剩余的时间
  9. private String tag;
  10. private TextView view;
  11. /**
  12. * 剩余时间的key
  13. */
  14. private final static String LEAVE_KEY="leave_time";
  15. /**
  16. * 当前时间的key
  17. */
  18. private final static String NOW_KEY="now_time";
  19. public SMSCodeUtil(TextView view,String tag,int time){
  20. this.tag=tag;
  21. this.past_time=Integer.parseInt((System.currentTimeMillis()-(Long)SharedPreferencesHelper.get(NOW_KEY+this.tag, 0L))/1000+"");
  22. if(this.past_time<0){
  23. this.past_time=0;
  24. }
  25. this.leave_time=(Integer)SharedPreferencesHelper.get(LEAVE_KEY+this.tag, 0)-past_time;
  26. System.out.println("past_time="+past_time);
  27. System.out.println("leave_time="+leave_time);
  28. this.view=view;
  29. this.time=time;
  30. }
  31. private void setTimeStart(int start){
  32. if(tUtil==null){
  33. tUtil=new TimerUtil(start, 0, new TimerCallBack() {
  34. @Override
  35. public void timerCallBack(int now, boolean alive) {
  36. System.out.println(now);
  37. if(alive){
  38. SMSCodeUtilHandler.sendEmptyMessage(now);
  39. }else{
  40. SMSCodeUtilHandler.sendEmptyMessage(0);
  41. }
  42. SharedPreferencesHelper.put(LEAVE_KEY+tag, now);
  43. SharedPreferencesHelper.put(NOW_KEY+tag, System.currentTimeMillis());
  44. }
  45. });
  46. tUtil.startTimer();
  47. }else{
  48. tUtil.stopTimer();
  49. tUtil=null;
  50. setTimeStart(start);
  51. }
  52. }
  53. @SuppressLint("HandlerLeak")
  54. private Handler SMSCodeUtilHandler=new Handler(){
  55. @Override
  56. public void handleMessage(Message msg) {
  57. if(msg.what==0){
  58. view.setText("重新发送");
  59. view.setEnabled(true);
  60. }else{
  61. view.setText("重新发送"+"("+msg.what+"s)");
  62. }
  63. }
  64. };
  65. public void restartTimer(){
  66. if(leave_time>0){
  67. if(leave_time>time){
  68. leave_time=(Integer)SharedPreferencesHelper.get(LEAVE_KEY+this.tag, 0);
  69. }
  70. view.setEnabled(false);
  71. setTimeStart(leave_time);
  72. }
  73. }
  74. public void startTimer(){
  75. view.setEnabled(false);
  76. setTimeStart(time);
  77. }
  78. public void stopTimer(){
  79. if(tUtil!=null)
  80. tUtil.stopTimer();
  81. }
  82. }

倒计时封装类:

  1. public class TimerUtil {
  2. private Timer timer=null;
  3. /**
  4. * 递增还是递减的标识,0表示递减,1表示递增,默认递减
  5. */
  6. private int order=0;
  7. private int start,end;
  8. private TimerCallBack timerCallBack;
  9. public TimerUtil(int start,int end,TimerCallBack timerCallBack) {
  10. this.start=start;
  11. this.end=end;
  12. this.timerCallBack=timerCallBack;
  13. }
  14. public TimerUtil(int start,int end,int order,TimerCallBack timerCallBack){
  15. this.start=start;
  16. this.end=end;
  17. this.timerCallBack=timerCallBack;
  18. this.order=order;
  19. }
  20. public void startTimer(){
  21. if(timer==null){
  22. timer=new Timer();
  23. }
  24. timer.schedule(new TimerTask() {
  25. @Override
  26. public void run() {
  27. if(order==0){
  28. start--;
  29. if(start<=end){
  30. timerCallBack.timerCallBack(start,false);
  31. stopTimer();
  32. }else{
  33. timerCallBack.timerCallBack(start,true);
  34. }
  35. }else if(order==1){
  36. start++;
  37. if(start>=end){
  38. timerCallBack.timerCallBack(start,false);
  39. stopTimer();
  40. }else{
  41. timerCallBack.timerCallBack(start,true);
  42. }
  43. }
  44. }
  45. }, 0,1000);
  46. }
  47. public void stopTimer(){
  48. if(timer!=null)
  49. timer.cancel();
  50. }
  51. public interface TimerCallBack{
  52. public void timerCallBack(int now,boolean alive);
  53. }
  54. }

调用代码:

  1. SMSCodeUtil sUtil=new SMSCodeUtil(button, "register", REGET_SMS_CODE_TIME);
  2. sUtil.restartTimer();

代码下载: http://download.csdn.net/download/u012800952/10050762

发表评论

表情:
评论列表 (有 0 条评论,132人围观)

还没有评论,来说两句吧...

相关阅读

    相关 计时

    验证输入手机号 验证码倒计时 ![这里写图片描述][SouthEast]![这里写图片描述][SouthEast 1] \如上图所示 要实现验证码的倒计时的效果