Android中通过定时器周期性执行网络请求
假如有如下需求: 你订阅了某个电影标签,这个标签的内容可能不定期更新,这时就需要启动定时器来周期请求后台接口信息。
在这里需要做的是,程序初始化启动时,开启定时器,为了网络能够稳定,可以延迟到30s后做网络请求。可以通过TimerCallBack回调,执行网络请求接口,在网络请求接口的回调中,重新启动定时器。Demo如下:
public class MessageHelper {
private static MessageHelper mMsgHelper = null;
private BaseTimer mRequestTimer = null;
private int timeTickCount = 0;
public static MessageHelper getInstance(){
if(mMsgHelper==null){
mMsgHelper = new MessageHelper();
}
return mMsgHelper;
}
/**
* 开启定时请求服务
*/
public void start(){
if(mRequestTimer==null){
mRequestTimer = new BaseTimer();
}
mRequestTimer.startTimer(20000, mTimerCallback);
timeTickCount = 0;
}
/**
* 关闭定时请求服务
*/
public void close(){
if(mRequestTimer!=null){
mRequestTimer.killTimer();
}
timeTickCount = 0;
}
/**
* 定时请求网络接口
*/
private void requestMessage(){
GeneralHttpHelper.getInstance().requestMessage(mMessageCb);
}
/**
* 定时请求会员领取提醒消息
*/
private void requestMemberFetchMessage(){
GeneralHttpHelper.getInstance().requestMemberFetchMessage(mMemberFetchMessageCb);
}
/**
* 定时器回调接口
*/
private TimerCallBack mTimerCallback = new TimerCallBack() {
@Override
public void callback() {
timeTickCount ++;
mRequestTimer.killTimer();
requestMessage(); //执行网络请求
if(timeTickCount % 6 == 0){
timeTickCount = 0;
if(null != Common.getGlobalData() && !Common.getGlobalData().getHasDeviceAuthorityReceived()){
requestMemberFetchMessage(); // 执行网络请求,间隔是requestMessage的6倍
}
}
}
};
private HttpCallback mMessageCb = new HttpCallback() {
@Override
public void onState(HTTP_STATE state) {
if(state==HTTP_STATE.STATE_SUCCESS){
ArrayList<INFO_NOTFICATION> msgList = StaticFunction.getGeneralData().getMessageList();
NotificationManager.getInstance().showNotification(msgList,null);
}
mRequestTimer.killTimer();
mRequestTimer.startTimer(30000, mTimerCallback);
//重新启动定时器请求
}
};
private HttpCallback mMemberFetchMessageCb = new HttpCallback() {
@Override
public void onState(HTTP_STATE state) {
if(state==HTTP_STATE.STATE_SUCCESS){
ArrayList<INFO_NOTFICATION> msgList = StaticFunction.getGeneralData().getMemberFetchMessageList();
NotificationManager.getInstance().showNotification(msgList,null);
}
}
};
}
注意此处,之所以要在网络请求的回调中重新启动定时器,是因为第一次可以延迟到20S后,后面可以每隔1小时执行1次网络请求,如果采用间隔执行任务startInterval(),那么每次都是20s请求一次。