Android Studio四十四期 - 倒计时

现在倒计时有很多种方法,这里给大家两个方法,代码经过洗礼:

1.CountDownTimer:调用的时候很简单:timer.start();    timer.cancel();

private TextView vertifyView;  
    private CountDownTimer timer = new CountDownTimer(10000, 1000) {  
  
        @Override  
        public void onTick(long millisUntilFinished) {  
            vertifyView.setText((millisUntilFinished / 1000) + "秒后可重发");  
        }  
  
        @Override  
        public void onFinish() {  
            vertifyView.setEnabled(true);  
            vertifyView.setText("获取验证码");  
        }  
    };

附:这种方法只能支持30分钟的倒计时,否则会有延迟。下面是很精准的方法,就是复杂一些~

2.WeakReference:以系统每次更新时间的一秒的时间差来倒计时。

private H mHandler2 = new H(this);
private static final int MSG_RUN = 189;
private static final int DELAY_MILLIS = 1000;
private long mCurrentTime;

private static class H extends Handler {
    private WeakReference<MainActivity> mActivity;
    private long mNextTime;

    public H(MainActivity activity) {
        mActivity = new WeakReference<MainActivity>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        MainActivity activity = mActivity.get();
        if (activity == null || msg.what != MSG_RUN) {
            return;
        }
        if (activity.decrTime(SystemClock.uptimeMillis() - mNextTime)) {
            mNextTime = SystemClock.uptimeMillis();
            sendEmptyMessageDelayed(MSG_RUN, DELAY_MILLIS);
        }
    }
}

支持传int hour int min int second和直接传时间戳long 60000 ms,另外给大家提供一个时间的util,希望能帮到你们。

package com.example.p027_daojishi.util;

import java.util.ArrayList;
import java.util.List;

public class TimeUtil {

    /**
     * @param ms
     * @return result[day, hour, minute, second]
     */
    public static long[] compute(long ms) {
        long[] result = new long[4];

        // day
        result[0] = ms / (24 * 60 * 60 * 1000);
        ms = ms % (24 * 60 * 60 * 1000);

        // hour
        result[1] = ms / (60 * 60 * 1000);
        ms = ms % (60 * 60 * 1000);

        // minute
        result[2] = ms / (60 * 1000);
        ms = ms % (60 * 1000);

        // second
        result[3] = ms / 1000;

        return result;
    }

    /**
     * @param
     * @return void
     * @throws Exception
     * @throws
     * @Description: 设置倒计时的时长
     */
    public static int[] setTime(int hour) {
        int[] result = new int[2];
        //hour 十位
        result[0] = hour / 10;
        //hour 个位
        result[1] = hour - hour / 10 * 10;
        return result;
    }

    /**
     * TimePicker设置初始化数据bufen
     *
     * @param hour
     * @param num
     */
    public static List<String> initTpTime(final int hour, final int num) {
        List<String> data = new ArrayList<String>() {
            {
                for (int i = hour; i < num; i++) {
                    add(i + "");
                }
            }
        };
        return data;
    }

    /**
     * TimePicker设置起始数据bufen
     * tp_hour.setData(setTpTime(hour, 24));
     * tp_min.setData(setTpTime(min, 60));
     * tp_sec.setData(setTpTime(sec, 60));
     * hour=12 num=24
     * min=59 num=60
     * sec=59 num=60
     *
     * @param hour
     * @param num
     */
    public static List<String> setTpTime(final int hour, final int num) {
        List<String> data = new ArrayList<String>() {
            {
                for (int i = hour; i < num; i++) {
                    add(i + "");
                }
                for (int i = 0; i < hour; i++) {
                    add(i + "");
                }
            }
        };
        return data;
    }

    /**
     * 获取倒计时布局的hour min sec bufen 10 : 12 : 59 02 : 01 : 02 转成 long
     *
     * @param timeStr
     * @return
     */
    public static long getTimeStrSec(String timeStr) {
        if (timeStr == null || timeStr.length() < 5) {
            return -1L;
        }
        String[] times = timeStr.split(":");
        if (times == null || times.length != 3) {
            return -1L;
        }
        if (times[0] == null || times[1] == null || times[2] == null) {
            return -1L;
        }
        long hour = Long.parseLong(times[0].trim());
        long minute = Long.parseLong(times[1].trim());
        long second = Long.parseLong(times[2].trim());
        return hour * 60L * 60L + minute * 60 + second;
    }

    /**
     * 1 2 3 转 01 02 03
     *
     * @param i
     * @return
     */
    public static String time_change_one(long i) {
        String s = String.format("%02d", i);
        return s;
    }

    /**
     * 01 02 12 zhuang 1 2 12
     *
     * @param data
     * @return
     */
    public static String time_change_two(String data) {
        char[] chars = data.toCharArray();
        if (String.valueOf(chars[0]).equals("0")) {
            data = String.valueOf(chars[1]);
        } else {
            data = data;
        }
        return data;
    }

}

附:TimerPicker初始化

tp_hour.setData(initTpTime(0, 24));
tp_min.setData(initTpTime(0, 60));
tp_sec.setData(initTpTime(0, 60));

总结:其实倒计时在订单统一时间的时候是需要精确的计算,不然差的时间加上网络的推送延时是有可能影响结算结果的,以上方法希望能帮到你。

时间: 2024-12-21 13:32:43

Android Studio四十四期 - 倒计时的相关文章

Android Studio第十四期 - Swipebacklayout最新版

支持了6.0~代码已经整理好,效果如下图: 地址:https://github.com/geeklx/MyApplication/tree/master/p011_swipebacklayout

Android Studio第二十四期 - Gson封装Utils

代码已经整理好,效果如下: Json.Utils: import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.

Android Studio第十五期 - 友盟统计集成

首先是官网的地址:http://dev.umeng.com/analytics/android-doc/integration#2_5 然后是注意实例化到Application中的代码:  private void setUMEngAnalsys() {   //开启Debug模式 上线可关闭   MobclickAgent.setDebugMode(true);   // SDK在统计Fragment时,需要关闭Activity自带的页面统计,   // 然后在每个页面中重新集成页面统计的代码

Android Studio第二十九期 - RecycleView的表格形式

本来说好了,最后一篇了,结果又来了一个新需求,就再写一篇吧~ 效果图是这样的: 思路是这样: demo效果: 其实要注意的地方是: 1.RecycleView在ScrollView中不滚动的设置: 2.RecycleView在ScrollView中滚动不灵敏: 3.RecycleView表格显示列数的填充算法: 不滚动的写法: FullyLinearLayoutManager: package com.example.p010_recycleviewall.recycleviewbiaoge;

Android Studio第十八期 - Snaphelper

代码已经整理好,效果如下图: GravitySnapHelper: /*  * Copyright (C) 2016 The Android Open Source Project  * Copyright (C) 2016 Rúben Sousa  *  * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance 

Android Studio第二十五期 - 自定义键盘+支付输入框

代码已经整理好,效果如下图: 地址:https://github.com/geeklx/MyApplication/tree/master/p017_keyboard

Android Studio第十六期 - 有广告植入的引导页demo

代码已经整理好,效果如下图: 地址:https://github.com/geeklx/MyApplication/tree/master/p012_welcomepage

Android Studio第二十六期 - 自定义Activity中Fragment之间的传值

代码已经整理好,效果如下图:(附:copy loader的~剪刀手~) 地址:https://github.com/geeklx/MyApplication/tree/master/p018_activity_fragmenta_b

Android Studio第十九期 - Glin架构

这次写的是loader的封装后的网络架构,在此基础上,把API提供给大家,另外添加一些自定义的控件,方便开发~持续更新~谢谢~ 地址:https://github.com/geeklx/MakeJarAAR API: 1.GlideUtil:图片缓存框架,支持圆角 //1 GlideUtil.display(MainActivity.this, iv1, "http://img0.bdstatic.com/img/image/touxiang01.jpg", GlideOptionsF

无限互联奖学金文章连载北京总部四十九期胡梦川 第一篇

无限互联奖学金文章连载北京总部四十九期胡梦川 第一篇: 今天是来到无限互联的第四天,严格来说已经第六天了,刚来就是开班典礼,给人一种很好的氛围.老师讲了很多关于以后学习的技巧和规定,我的第一感觉是,比备战高考还要严格,不过这才能体现一个组织的负责任.正式开讲才感觉到这个班级的大神无处不在,不努力根本赶不上,就是这个学习氛围和高强度的练习很重要.多用心你才能感觉到有些事其实很简单.关于学习时间大家基本都是一天不动的在敲代码,等于给自己一个机会吧.时间飞逝,抓住机会才重要.刚来第一周,感受最深就是好