HandlerThread最大的優勢在於引入MessageQueue概念,可以進行多任務隊列管理。
HandlerThread背后只有一個線程,所以任務是串行依次執行的。串行相對於並行來說更安全,各任務之間不會存在多線程安全問題。
HandlerThread所產生的線程會一直存活,Looper會在該線程中持續的檢查MessageQueue,並開啟消息處理的循環。這一點和Thread(),AsyncTask都不同,thread實例的重用可以避免線程相關的對象的頻繁重建和銷毀。 getLooper().quit();來退出這個線程,其實原理很簡單,就是改變在消息循環里面標志位,退出整個while循環,使線程執行完畢。
部分 測試代碼如下:
public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- tv_name = (TextView) findViewById(R.id.tv_name);
- btn_name = (Button) findViewById(R.id.btn_name);
- Log.i(TAG, "==================main thread:" + Thread.currentThread().getName());
- final HandlerThread mHandlerThread = new HandlerThread("handlerThread");
- mHandlerThread.start();
- // Handler的handlerMessage方法在主線程執行還是在子線程執行,取決於創建Handler時傳遞給Handler的looper
- final MyHandler mHanlder = new MyHandler(mHandlerThread.getLooper());
- btn_name.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- mHanlder.sendEmptyMessage(1);
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- mHandlerThread.getLooper().quit();
- }
- });
- }
- class MyHandler extends Handler {
- public MyHandler(Looper looper) {
- super(looper);
- }
- @Override
- public void handleMessage(Message msg) {
- Log.i(TAG, "==================" + Thread.currentThread().getName());
- // 輸出內容為: ==============handlerThread
- //tv_name.setText("hello, this is the first message from handler");
- super.handleMessage(msg);
- }
- }
不過要注意:要想更新界面內容,還是需要使用主線程的Looper,不然的話還是會拋錯誤。