现在倒计时有很多种方法,这里给大家两个方法,代码经过洗礼:
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
原文:http://liangxiao.blog.51cto.com/3626612/1950549