前言
项目中有需求就是没过一断时间去向服务器发送请求然后去刷新UI其实思路还是比较多的但是我还是选择了CounterDownTimer方法 。
CounterDownTimer
话说其实用法很简单就是通过一个onTick方法来实现定时执行。但是怎么去实现了,对就是为什么。没看源码之前我猜它的大概思路是:
- 获取系统时间用来判断
- 通过handler机制切换线程
- 一些具体完成开始的操作
于是乎我决定从CounterDownTimer入手简单一看他重写两个方法以及一个构造方法:
onTick
onfinsh
点击CounterDownTimer一看
public synchronized final void cancel() {
mCancelled = true;
mHandler.removeMessages(MSG);
}
可见handler猜测是对的我们取消发送时它内部是直接移除的
其实到这一目了然我们看看我们调用start()时他做了什么:
public synchronized final CountDownTimer start() {
mCancelled = false;
if (mMillisInFuture <= 0) {
onFinish();
return this;
}
mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;
mHandler.sendMessage(mHandler.obtainMessage(MSG));
return this;
}
也就是判断是否完成你发送的时间是否完成如果没完成的话通过mHandler 继续发送消息同时获取一下系统消息来判断一下。
那他是怎么延迟的呢?
当然是调用 sendMessageDelayed(obtainMessage(MSG), delay);来设置每隔多少秒发送。到这也没啥了。用法更简单:
//博客列表刷新
class CountTimer extends CountDownTimer {
public CountTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long millisUntilFinished) {
//设置间隔时间进行的请求
}
@Override
public void onFinish() {
}
}
调用时:
if (timer==null){
timer=new CountTimer(86400000,600000);
}
timer.start();
记得销毁时:取消一下请求
if(timer!=null){
timer.cancel();
}