在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