HandlerThread 用法


     HandlerThread最大的優勢在於引入MessageQueue概念,可以進行多任務隊列管理。

 

  HandlerThread背后只有一個線程,所以任務是串行依次執行的。串行相對於並行來說更安全,各任務之間不會存在多線程安全問題。

 

  HandlerThread所產生的線程會一直存活,Looper會在該線程中持續的檢查MessageQueue,並開啟消息處理的循環。這一點和Thread(),AsyncTask都不同,thread實例的重用可以避免線程相關的對象的頻繁重建和銷毀。 getLooper().quit();來退出這個線程,其實原理很簡單,就是改變在消息循環里面標志位,退出整個while循環,使線程執行完畢。

 

     部分 測試代碼如下: 

    public void onCreate(Bundle savedInstanceState) {

Java代碼   收藏代碼
  1.     super.onCreate(savedInstanceState);  
  2.     setContentView(R.layout.main);  
  3.     tv_name = (TextView) findViewById(R.id.tv_name);  
  4.     btn_name = (Button) findViewById(R.id.btn_name);  
  5.     Log.i(TAG, "==================main thread:" + Thread.currentThread().getName()); 
  6.  
  7.     final HandlerThread mHandlerThread = new HandlerThread("handlerThread");  
  8.     mHandlerThread.start(); 
  9.     // Handler的handlerMessage方法在主線程執行還是在子線程執行,取決於創建Handler時傳遞給Handler的looper 
  10.     final MyHandler mHanlder = new MyHandler(mHandlerThread.getLooper());  
  11.       
  12.     btn_name.setOnClickListener(new OnClickListener() {  
  13.           
  14.         @Override  
  15.         public void onClick(View v) {  
  16.             mHanlder.sendEmptyMessage(1);  
  17.               
  18.             try {  
  19.                 Thread.sleep(3000);  
  20.             } catch (InterruptedException e) {  
  21.                 e.printStackTrace();  
  22.             }  
  23.             mHandlerThread.getLooper().quit();  
  24.         }  
  25.     });  
  26. }  
  27.   
  28. class MyHandler extends Handler {  
  29.   
  30.     public MyHandler(Looper looper) {  
  31.         super(looper);  
  32.     }  
  33.   
  34.     @Override  
  35.     public void handleMessage(Message msg) {  
  36.         Log.i(TAG, "==================" + Thread.currentThread().getName()); 
  37.          // 輸出內容為: ==============handlerThread 
  38.         //tv_name.setText("hello, this is the first message from handler");  
  39.         super.handleMessage(msg);  
  40.     }  
  41. }  

 

   不過要注意:要想更新界面內容,還是需要使用主線程的Looper,不然的話還是會拋錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM