前言
项目中有需求就是没过一断时间去向服务器发送请求然后去刷新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);来设置每隔多少秒发送。到这也没啥了。用法更简单,看下方使用方法:
CountDownTimer 倒计时,可以在主线程使用。
定义一个全局值
private CountTimer timer=null;
//定时列表刷新任务
class CountTimer extends CountDownTimer {
public CountTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long millisUntilFinished) {
//设置间隔时间进行的请求
//getData();
}
@Override
public void onFinish() {
}
}
使用方法:
//这里所有的参数都是毫秒,使用秒需要 time乘以1000
//long millisInFuture 倒计时总时间
//long countDownInterval 间隔多久倒计时一次
//以下参数是 一共60秒,每10秒倒计时一次
if (timer==null){
timer=new CountTimer(60*1000,10*1000);
}
timer.start();
@Override
public void onDestroyView() {
super.onDestroyView();
//销毁时关闭刷新
if(timer!=null){
timer.cancel();
}
}
网友评论