關於對HandlerThread的了解


在Android中經常需要創建一個循環線程,有耗時操作時候,放到里面去操作,如果沒有耗時操作,就讓該線程處於等待,但是不要殺死它,

最好不要一旦有耗時任務,就立刻創建一個新線程,因為會有性能問題。

 

HandlerThread的父類是Thread,內部會有一個looper循環:

首先看一下HandlerThread的構造方法:

注意:一個是默認優先級,一個是可以設置優先級

 

開始啟動:

注意:上面的run方法就是為了調用Looper.prepare和Looper.loop來構建一個循環線程

 

getLooper()來獲取當前HandlerThread線程的mLooper對象:

注意:在獲取mLooper對象的時候有一個同步的問題,只有當線程創建成功,而且Looper對象也創建成功,才會獲取到mLooper對象,

這里的wait()和run里面的notifyAll()共同完成同步問題 。

 

結束當前線程的循環:quit()

 

 

demo:

 1 public class MainActivity extends AppCompatActivity {
 2 
 3     private Button btn ;
 4     private Handler mUIHandler;
 5     private Handler mSubHandler;
 6     private TextView textView;
 7 
 8 
 9 
10     private Handler.Callback mSubCallback = new Handler.Callback() {
11         //該接口的實現就是處理異步耗時任務的,因此該方法執行在子線程中
12         @Override
13         public boolean handleMessage(Message msg) {
14 
15             switch (msg.what) {
16                 case 0:
17                     Message msg1 = new Message();
18                     msg1.what = 0;
19                     msg1.obj = java.lang.System.currentTimeMillis();
20                     mUIHandler.sendMessage(msg1);
21                     break;
22 
23                 default:
24                     break;
25             }
26 
27             return false;
28         }
29     };
30 
31     @Override protected void onCreate(Bundle savedInstanceState) {
32         super.onCreate(savedInstanceState);
33         setContentView(R.layout.activity_main);
34 
35         btn = (Button) this.findViewById(R.id.button);
36         textView = (TextView) findViewById(R.id.textView);
37 
38         HandlerThread workHandle = new HandlerThread("workHandleThread");
39         workHandle.start();
40 
41         //在創建Handler作為HandlerThread線程消息執行者的時候必須調用start方法之后,
42         //因為創建Handler需要的Looper參數是從HandlerThread類中獲得,
43         //而Looper對象的賦值又是在HandlerThread的run方法中創建。
44         mSubHandler = new Handler(workHandle.getLooper(), mSubCallback);
45 
46         btn.setOnClickListener(new View.OnClickListener() {
47             @Override public void onClick(View v) {
48                 //投放異步耗時任務到HandlerThread中
49                 mSubHandler.sendEmptyMessage(0);
50 
51             }
52         });
53     }
54 }

 

 

參考:http://blog.csdn.net/feiduclear_up/article/details/46840523

 


免責聲明!

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



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