Android學習筆記——HandlerThread與IntentService
參考: https://blog.csdn.net/javazejian/article/details/52426353
https://www.jianshu.com/p/ab77a2e83c52
https://blog.csdn.net/javazejian/article/details/52426425
- HandlerThread
是一個內部有Looper 的 Thread 子類
與線程池不同的是,HandlerThread是一個串行隊列,它只有一個線程。
使用方法:
1.實例化一個HandlerThread對象,參數是該線程的名稱
2.通過 handlerThread.start()啟動線程
3.實例化一個Handler並且參數為handlerThread.getLooper(),完成handler於handlerThread的綁定 ,
在handlerMessage方法中就是在 handelr_thread線程中執行了
4.可用handler執行異步任務
5.不需要handlerThread時,用 handlerThread.quit()結束線程。
使用樣例
private HandlerThread myHandlerThread ;private Handler handler ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //實例化HandlerThread myHandlerThread = new HandlerThread("myHandler") ; //開啟HandlerThread myHandlerThread.start();//將Handler對象與HandlerThread線程綁定 handler =new Handler(myHandlerThread.getLooper()){ @Override publicvoid handleMessage(Message msg) { super.handleMessage(msg); // 這裏接收Handler發來的消息,運行在handler_thread線程中 //TODO... } }; //在主線程給Handler發送消息 handler.sendEmptyMessage(1) ; new Thread(new Runnable() { @Override publicvoid run() { //在子線程給Handler發送數據 handler.sendEmptyMessage(2) ; } }).start(); } @Override protected void onDestroy() { super.onDestroy(); //終止HandlerThread運行 myHandlerThread.quit() ; }
- IntentService
是一個繼承自Service的抽象類
優點: 相比於線程,因為是服務,優先級更高,所以更不容易被殺死,適合執行一些高優先級的後臺任務
相比於普通service , 可以自動創建子線程執行任務,並完成任務後自動退出
使用方法:
創建類 繼承IntentService, 重寫onHandleIntent 方法,在配置文件中註冊
在活動中用intent 配合startService 啟動intentService
因為是通過Intent啟動,可以在intent中放入相關參數,在onHandleIntent 中可以使用這些參數
內部原理:
在IntentService.onCreate()裏創建了一個 HandlerThread對象,和一個ServiceHandler對象(繼承自Handler), 構造serviceHandler的參數為handlerThread的Looper, 這樣將二者綁定,因為handlerThread是一個子線程,所以serviceHandler就是在子線程中執行任務了。
serviceHandler 把任務請求的 intent 封裝為Message 丟給handlerThread 中Looper 的 MessageQueue,,(流程與Handler一樣)
最終任務會回到serviceHandler的 handleMessage()方法,而這個方法內部調用的就是我們重寫的 onHandlerIntent(),真實地執行任務。
handleMessage()中,調用onHandleIntent() 之後就會調用stopSelf() 結束服務。
在stopSelf()中如果不填入參數,就會立即停止。而填入 msg.arg1 參數,就會等待所有任務都處理完畢才停止。
Android學習筆記——HandlerThread與IntentService