使用HandlerThread實現後臺服務輪詢執行任務
阿新 • • 發佈:2018-12-31
需求:後臺服務輪詢執行網路請求,並將返回結果更新資料庫
輪詢實現方案:
方案一: 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。