HandlerThread本質上就是一個普通Thread,只是這個線程內部有一個looper,而這個looper有一個消息隊列MessageQue,它經過不斷的用looper去檢查MessageQue而後取出消息而後處理。html
建立一個HandlerThread網絡
mThread = new HandlerThread("handler_thread");app
啓動一個HandlerThreadide
mThread.start();oop
方式一ui
public class MainActivity extends AppCompatActivity { private HandlerThread myHandlerThread ; private Handler handler ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //建立一個線程,線程名字:handler-thread myHandlerThread = new HandlerThread( "handler-thread") ; //開啓一個線程 myHandlerThread.start(); //在這個線程中建立一個handler對象 handler = new Handler( myHandlerThread.getLooper() ){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); //這個方法是運行在 handler-thread 線程中的 ,能夠執行耗時操做 Log.d( "handler " , "消息: " + msg.what + " 線程: " + Thread.currentThread().getName() ) ; } }; //在主線程給handler發送消息 handler.sendEmptyMessage( 1 ) ; new Thread(new Runnable() { @Override public void run() { //在子線程給handler發送數據 handler.sendEmptyMessage( 2 ) ; } }).start() ; } @Override protected void onDestroy() { super.onDestroy(); //釋放資源 myHandlerThread.quit() ; } }
運行效果:.net
/com.app D/handler: 消息: 1 線程: handler-thread /com.app D/handler: 消息: 2 線程: handler-thread
方式二線程
首先繼承了HandlerThread,並實現了 Handler.Callback的接口code
private class MyHandlerThread extends HandlerThread implements Handler.Callback { public MyHandlerThread(String name) { super(name); } @Override public boolean handleMessage(Message msg) { System.out.println("handleMessage CurrentThread=" + Thread.currentThread().getName()); handlerUi.sendEmptyMessage(i); i++; return false; } }
初始化該handlerThread並啓動htm
handlerThread = new MyHandlerThread("myHandler"); handlerThread.start();
Ui線程獲取能給HandlerThread發消息的Handler
handler = new Handler(handlerThread.getLooper(), handlerThread);
HandlerThread 的使用場景
HandlerThread 所作的就是在新開的子線程中建立了 Looper,那它的使用場景就是 Thread + Looper 使用場景的結合,即:在子線程中執行耗時的、可能有多個任務的操做。
好比:多個下載任務 具體實例可參考連接:http://blog.csdn.net/u011240877/article/details/72905631
HandlerThread將loop轉到子線程中處理,說白了就是將分擔MainLooper的工做量,下降了主線程的壓力,使主界面更流暢。
開啓一個線程起到多個線程的做用。處理任務是串行執行,按消息發送順序進行處理。HandlerThread本質是一個線程,在線程內部,代碼是串行處理的。
可是因爲每個任務都將以隊列的方式逐個被執行到,一旦隊列中有某個任務執行時間過長,那麼就會致使後續的任務都會被延遲處理。
HandlerThread擁有本身的消息隊列,它不會干擾或阻塞UI線程。
對於網絡IO操做,HandlerThread並不適合,由於它只有一個線程,還得排隊一個一個等着。
參考連接: