1. 程式人生 > >Android 中通過定時器週期性執行網路請求

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