Android Studio四十四期 - 倒计时

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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));

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

    技术分享


本文出自 “梁肖技术中心” 博客,请务必保留此出处http://liangxiao.blog.51cto.com/3626612/1950549

以上是关于Android Studio四十四期 - 倒计时的主要内容,如果未能解决你的问题,请参考以下文章

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

Android Studio第十四期 - Swipebacklayout最新版

Android Studio 第六十四期 - Android业务组件化之URL Scheme使用

分布式技术追踪 2017年第四十四期

北京-第四十四期前端框架的选择

Android第五十四期 - 超级巨图Glide3.7和Glide4.1.1优化加载方案全网首发