时间循环
Timer
TimerTask
-
通过 Timer 和 TimerTask 的配合来达到时间按间隔触发事件的效果,每个 TimerTask 只能被 Timer 启动一次,多次启动会抛出 TimerTask already scheduled 异常
-
Timer 可以启动多个 TimerTask
-
Timer 的 cancel 方法会停止由该 Timer 对象启动的所有 TimerTask
-
TimerTask 的 cancel 方法会停止当前 TimerTask 对象
// 声明一个变量来存储当前已经循环的次数
private int position;
// 声明 Timer
private Timer mTimer = new Timer();
// 声明 TimerTask
private TimerTask mTimerTask = new TimerTask() {
// TimerTask 的 run 方法中为每次触发时的回调
@Override
public void run() {
// TimerTask 的 run 方法执行在 Timer 线程池中,是子线程,如果要操作 UI 必须切换到主线程
runOnUiThread(new Runnable() {
@Override
public void run() {
position++; // 主线程中的执行
}
});
// 子线程中的执行代码
Log.i("TimerTask:" + Thread.currentThread().getName());
}
};
/**
* 启动 TimerTask
*/
private void initTimer() {
// 两个参数的方法,第二个参数表示 TimerTask 触发的延迟时间
// mTimer.schedule(mTimerTask, 2000);
// 三个参数的方法,第二个参数表示 TimerTask 触发的延迟时间,第三个参数表示循环的时间间隔
mTimer.schedule(mTimerTask, 2000,5000);
}
时间递减器
自定义类继承 CountDownTimer ,重写其构造方法
millisInFuture 表示倒计时的时长
countDownInterval 表示倒计时的间隔
onTick(long millisUntiFinished) 在倒计时中每下降设置的间隔时会被触发,参数为剩余的时间,我们可以在这个方法中执行需要执行的逻辑
onFinish() 倒计时结束时触发
/**
* Created by renxl
* On 2017/5/18 9:58.
*/
public class CountTimerView extends CountDownTimer {
private static final long DEFAULT_TIME = 61 * 1000;
private static final long DEFAULT_INTERVAL = 1000;
private TextView tvTime;
private int strId;
public CountTimerView(TextView tv) {
this(DEFAULT_TIME, DEFAULT_INTERVAL, tv, cn.smssdk.gui.R.string.smssdk_resend_identify_code);
}
public CountTimerView(TextView tv, int strId) {
this(DEFAULT_TIME, DEFAULT_INTERVAL, tv, strId);
}
/**
* @param millisInFuture The number of millis in the future from the call 需要倒计时的时长
* to {@link #start()} until the countdown is done and {@link #onFinish()}
* is called.
* @param countDownInterval The interval along the way to receive
* {@link #onTick(long)} callbacks. 倒计时的间隔
*/
public CountTimerView(long millisInFuture, long countDownInterval, TextView tv, int strId) {
super(millisInFuture, countDownInterval);
tvTime = tv;
this.strId = strId;
tvTime.setEnabled(false);
}
/**
* 倒计时过程显示
*
* @param millisUntilFinished 剩余的时间
*/
@Override
public void onTick(long millisUntilFinished) {
String str = millisUntilFinished / 1000 + "秒后可重新发送";
tvTime.setText(str);
}
/**
* 倒计时结束时触发
*/
@Override
public void onFinish() {
tvTime.setText(strId);
tvTime.setEnabled(true);
}
}
时间循环器和时间递减器的使用还是挺简单的,在开发中我们就不需要通过 Handler 这种复杂的方式来来操作
网友评论