Android CountDownTimer倒计时器的使用和Handler

http://blog.csdn.net/lilu_leo/article/details/6941724


/**
 * 验证码请求倒计时工具类
 *
 * @version v1.0
 * @copyright 2010-2015
 */

@SuppressLint("ResourceAsColor")
public class TimeUtil {

    // 倒计时timer
    private CountDownTimer countDownTimer;
    // 计时结束的回调接口
    private OnFinishListener listener;

    private TextView tv;
    private Context mContext;

    /**
     * @param tvSend   需要显示倒计时的TextView
     * @param max      需要进行倒计时的最大值,单位是秒
     * @param interval 倒计时的间隔,单位是秒
     */
    public TimeUtil(final Context context, final TextView tvSend, int max, int interval) {

        this.mContext = context;
        this.tv = tvSend;
        // 由于CountDownTimer并不是准确计时,在onTick方法调用的时候,time会有1-10ms左右的误差,这会导致最后一秒不会调用onTick()
        // 因此,设置间隔的时候,默认减去了10ms,从而减去误差。
        // 经过以上的微调,最后一秒的显示时间会由于10ms延迟的积累,导致显示时间比1s长max*10ms的时间,其他时间的显示正常,总时间正常
        countDownTimer = new CountDownTimer(max * 1000, interval * 1000 - 10) {

            @Override
            public void onTick(long time) {
                tv.setTextColor(context.getResources().getColor(R.color.black));
                tv.setBackgroundColor(context.getResources().getColor(R.color.white));
                // 第一次调用会有1-10ms的误差,因此需要+15ms,防止第一个数不显示,第二个数显示2s
                tv.setText(((time + 15) / 1000) + "秒后可重发");

            }

            @Override
            public void onFinish() {
                tv.setClickable(true);
                // tv.setTextColor(Color.parseColor("#028ce3"));
//				tv.setText(R.string.repeat_send);
                if (listener != null) {
                    listener.finish();
                }
            }
        };
    }

    /**
     * 开始倒计时
     */
    public void start() {
        tv.setClickable(false);
        countDownTimer.start();
    }

    /**
     * 设置倒计时结束的监听器
     *
     * @param listener
     */
    public void setOnFinishListener(OnFinishListener listener) {
        this.listener = listener;
    }

    /**
     * 计时结束的回调接口
     */
    public interface OnFinishListener {
        public void finish();
    }

    public void cancel() {
        countDownTimer.cancel();
        tv.setClickable(true);
        // tv.setTextColor(Color.parseColor("#028ce3"));
        tv.setText(mContext.getResources().getString(R.string.repeat_send));
    }
}



handler使用倒计时

/*=====*/
    Handler msmTimeOpHandler = new Handler();
    Runnable msmTimeOpRunnable = new Runnable() {
        @Override
        public void run() {
            msmTimeOp();
        }
    };
    private void msmTimeOp() {
        smsVailTime--;
        if (smsVailTime == 1) {
            vTimeTv.setText("正在跳转");

            boolean isfirstStart = mSP.get().getBoolean(Config.SP_ISFIRSTSTART, false);
            if (isfirstStart) {
                PrefManager.getInstance().setLong(ExtraConstrat.OP_TIME, 0);
                startActivity(MainActivity.class);
            } else {
                startActivity(GuidActivity.class);
            }
            mActivity.finish();
        } else {
            vTimeTv.setText(smsVailTime + "秒跳转");
            msmTimeOpHandler.postDelayed(msmTimeOpRunnable, 1000);
        }
    }

发送按钮监听执行

   msmTimeOpHandler.postDelayed(msmTimeOpRunnable, 1000);




猜你喜欢

转载自blog.csdn.net/code_dream_wq/article/details/78021022