/**
* 计时工具类
* @author boyko
*/
public class MyTimer {
private OnTimeEndListener mListener;
private Handler timehandler= new Handler();
/**
* 是否在规定的时间内
*/
private static boolean inTime = false;
private static volatile MyTimer sInst = null; // <<< 这里添加了 volatile
/**
* 执行间隔倒计时操作时,所要执行的次数
*/
private int intervaTime = -1;
/**
* 执行间隔倒计时操作时,已操作的次数
*/
private int implementNumber = 0;
private int intervalMilliSecond;
private OnIntervalTimeEndListener intervalTimeEndListener;
public static MyTimer getInstance() {
MyTimer inst = sInst; // <<< 在这里创建临时变量
if (inst == null) {
synchronized (MyTimer.class) {
inst = sInst;
if (inst == null) {
inst = new MyTimer();
sInst = inst;
}
}
}
return inst; // <<< 注意这里返回的是临时变量
}
Runnable myTimer= new Runnable(){
@Override
public void run() {
inTime = false;
if (mListener != null)
mListener.onTimeEnd();
}
};
/**\
* 间隔时间所用到的计时器
*/
Runnable intervalTimer= new Runnable(){
@Override
public void run() {
if (implementNumber < intervaTime){
implementNumber++;
if (intervalTimeEndListener != null)
intervalTimeEndListener.OnIntervalTimeEnd(implementNumber);
timehandler.postDelayed(intervalTimer, intervalMilliSecond);
}
}
};
/**
* 倒计时结束之后,执行操作
* @param milliSecond 倒计时毫秒值
*/
public void doTimeEnd(int milliSecond,OnTimeEndListener mListener){
this.mListener = mListener;
timehandler.postDelayed(myTimer, milliSecond);
}
/**
* 间隔规定时间执行规定次数的指定操作
*
* @param intervalMilliSecond 间隔毫秒值
* @param intervaTime 执行次数
*/
public void intervalTimeEnd(int intervalMilliSecond, int intervaTime,OnIntervalTimeEndListener intervalTimeEndListener) {
this.intervalMilliSecond = intervalMilliSecond;
this.intervalTimeEndListener = intervalTimeEndListener;
this.intervaTime = intervaTime;
implementNumber++;
if (intervalTimeEndListener != null)
intervalTimeEndListener.OnIntervalTimeEnd(implementNumber);
timehandler.postDelayed(intervalTimer, intervalMilliSecond);
}
/**
* 在所规定的时间内,只可操作一次
* @param milliSecond 倒计时毫秒值
* @param toa 提示信息
*/
public boolean doOnceTime(int milliSecond,String toa) {
if (inTime){
return !inTime;
}
inTime = true;
timehandler.postDelayed(myTimer, milliSecond);
return inTime;
}
/**
* 停止倒计时
*/
public void cancel() {
timehandler.removeCallbacks(myTimer);
}
/**
* 以最后依次调取该方法的时间,为起始时间开始倒计时
* @param milliSecond
*/
public void doLastTimeEnd(int milliSecond,OnTimeEndListener mListener){
this.mListener = mListener;
cancel();
timehandler.postDelayed(myTimer, milliSecond);
}
/**
* 两次确认操作
* @param milliSecond 在多少毫秒内,触摸有效
* @param toa 所要提示的内容
* @param context
* @return [true]可以继续下面的操作 [false]不可继续进行
*/
public boolean doInTime(int milliSecond, String toa, Context context){
this.mListener = mListener;
if (inTime){
inTime = false;
return true;
}
inTime = true;
timehandler.postDelayed(myTimer, milliSecond);
return false;
}
public interface OnTimeEndListener {
void onTimeEnd();
}
public interface OnIntervalTimeEndListener {
/**
* @param implementNumber 已执行次数
*/
void OnIntervalTimeEnd(int implementNumber);
}
}
用于倒计时的工具类
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 缘由 对于做这个封装的目的就是想制造一个简单易用无风险的验证码倒计时控件吧 便于在多个项目使用,网络上也有很多类似...
- 左边是输出台,右边是tableView,点击后modal了一个控制器,停止了计时器 一、主要功能 对于tableV...