1、工具类
/*** 作者:created by meixi* 邮箱:15913707499@163.com* 日期:2018/12/28 15*/public class TimerUtil {private static final int nHandlerMsg = 23566124;private int nStartDelayTime;private int nIntervalTime;private Timer mTimer;private TimerTask mTimeTask;private Handler mHandler;private OnTimerChangeListener onTimerChangeListener;public TimerUtil(int nStartDelayTime, int nIntervalTime, OnTimerChangeListener onTimerChangeListener) {this.nStartDelayTime = nStartDelayTime;this.nIntervalTime = nIntervalTime;this.onTimerChangeListener = onTimerChangeListener;}/*** 计时器开始*/public void timeStart() {timeStop();mHandler = new TimeHandler(this);mTimeTask = new TimerTask() {@Overridepublic void run() {if (mHandler != null)mHandler.obtainMessage(nHandlerMsg).sendToTarget();}};mTimer = new Timer();mTimer.schedule(mTimeTask, nStartDelayTime, nIntervalTime);}/*** 停止计时器*/public void timeStop() {if (mTimer != null)mTimer.cancel();if (mTimeTask != null)mTimeTask.cancel();mTimeTask = null;mHandler = null;mTimer = null;}private void doTimeChange() {if (onTimerChangeListener != null)onTimerChangeListener.doChange();}private static class TimeHandler extends Handler {WeakReference<TimerUtil> weakReference;public TimeHandler(TimerUtil timerUtil) {weakReference = new WeakReference<>(timerUtil);}@Overridepublic void handleMessage(Message msg) {TimerUtil timerUtil = weakReference.get();if (msg.what == nHandlerMsg)timerUtil.doTimeChange();super.handleMessage(msg);}}public interface OnTimerChangeListener {void doChange();} }
2、实例化
private int mMin = 11; private TimerUtil timerUtil;
private void initTimerUtil() {TimerUtil.OnTimerChangeListener onTimerChangeListener = new TimerUtil.OnTimerChangeListener() {@Overridepublic void doChange() {doTimeChange();}};timerUtil = new TimerUtil(0, 1000, onTimerChangeListener);}private void doTimeChange() {mMin--;if (mMin < 0) {mMin = 11; // timeStop();//如是周期倒计时,不停。一次性倒计时则,stop // activityExchangePhoneSendCode.setText("获取验证码");Log.i("lgq","sss6666==ss="+mMin);return;}Log.i("lgq","sss6666==="+mMin); // activityExchangePhoneSendCode.setText(String.valueOf(mMin)+"秒后重发");//倒计时过程}/*** 停止计时器*/private void timeStop() {timerUtil.timeStop();}/*** 计时器开始*/private void timeStart() {timerUtil.timeStart();}
3、调用开始
onCreate方法调用初始化
initTimerUtil();随时开启倒计时timeStart();
时分秒倒计时
int ms,fs,ss;public void daojishi(String shi,String fen,String mian){ss = Integer.parseInt(shi);fs = Integer.parseInt(fen);ms = Integer.parseInt(mian);//开始延时5秒,每次间隔12秒Observable.interval(1, 1, TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Long>() {@Overridepublic void accept(Long aLong) {runOnUiThread(new Runnable() {@Overridepublic void run() {// LgqLogPlus.e("倒计时。。。。"+ms);if (ms>0){ms--;if (ms<10){miaote.setText("0"+ms);}else {miaote.setText(ms+"");}}else if (ms==0){if (fs>0){if (ms==0){ms=60;miaote.setText(ms+"");}}if (fs>0){fs--;if (fs<10){fente.setText("0"+fs);}else {fente.setText(fs+"");}}else if (fs==0){if (ss>0){if (fs==0){fs=60;fente.setText(fs+"");}}if (ss>0){ss--;fs=60;ms=60;if (ss<10){shite.setText("0"+ss);}else {shite.setText(ss+"");}}else {shite.setText("00");}}}}});}});}
方法2-------------------------------------------
private Handler handler = new Handler(Looper.getMainLooper());private int CONNECT_INTERVAL = 300; private int iCurrConnTimes = 0;//当前进度 private int CONNECT_TIMES = 100;//30秒 =CONNECT_INTERVAL*CONNECT_TIMESboolean ifrun;
控制
handler.postDelayed(connectRunnable, CONNECT_INTERVAL);kaibt.setOnClickListener(v -> {ifrun=true;handler.postDelayed(connectRunnable, CONNECT_INTERVAL); }); guanbt.setOnClickListener(v -> {ifrun = false;});
运行
private Runnable connectRunnable = new Runnable() {@Overridepublic void run() {iCurrConnTimes++;LgqLogPlus.d("倒计时==== "+iCurrConnTimes);tvProgress.setText(iCurrConnTimes+"%");if (iCurrConnTimes < CONNECT_TIMES){if (ifrun){handler.postDelayed(connectRunnable, CONNECT_INTERVAL);}}else {handler.removeCallbacks(connectRunnable);}} };@Override protected void onDestroy() {super.onDestroy();handler.removeCallbacksAndMessages(null); }