Android 中通过定时器周期性执行网络请求

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请求一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值