1. 程式人生 > >使用HandlerThread實現後臺服務輪詢執行任務

使用HandlerThread實現後臺服務輪詢執行任務

需求:後臺服務輪詢執行網路請求,並將返回結果更新資料庫

輪詢實現方案:

方案一: Service + Timer + Thread

實現思路:使用timer定時執行TimerTask
缺點:如果有非同步任務,下次任務開始執行時需要判斷上次任務是否完成,從而導致任務間隔時間不可控。

方案二: Service + HandlerThread

實現思路:在HandleMessage方法中執行任務,任務結束後向MessageQueue中新增延時訊息
優點:如果有非同步任務,只需在非同步任務執行完畢後再向MessageQueue中新增延時訊息,任務間隔時間可控

結論:使用方案二實現輪詢更適合。

關鍵程式碼實現:

BackgroundService.java

@Override
public IBinder onBind(Intent intent) {
    HandlerThread handlerThread = new HandlerThread("BackgroundService");
    handlerThread.start();
    handler = new Handler(handlerThread.getLooper()){
        @Override
        public void handleMessage(Message msg) {
            super
.handleMessage(msg); //模擬耗時任務 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } //向MessageQueue中新增延時訊息,5s後重復執行以上任務 handler.sendEmptyMessageDelayed(MSG_GET_COMPARE_RESULT,5000
); } }; return new GetCompareResultBinder(); }

補充:
Android官方推薦使用IntentService來替代Service實現後臺服務。分析IntentService原始碼可以看出,其內部實現與方案二類似。需要注意的是IntentService在handleMessage方法最後會呼叫stopSelf方法來停止服務,所以要想實現服務不停止,需要設定msg.what不等於-1。