Android 中通過定時器週期性執行網路請求
阿新 • • 發佈:2019-01-30
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請求一次。