1. 程式人生 > >Android學習筆記——HandlerThread與IntentService

Android學習筆記——HandlerThread與IntentService

pre https 發送數據 不容易 todo -s 退出 oop public

參考: 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