在Android開發中經常會使用到線程,一想到線程,一般都會想到
new Thread(){...}.start();
這樣的方式。這樣如果在一個Activity中多次調用上面的代碼,那麼將建立多個匿名線程,如果這些線程的沒有被銷毀,那肯定會影響效能呢。這個時候我麼就想到了android提供的一個非同步處理線程的類HandlerThread。
一般Handler的用法
Handler handler = new Handler(){...};
這樣建立的handler是在主線程即UI線程下的Handler,即這個Handler是與UI線程下的預設Looper綁定的(當然也只有主線程才能這麼幹,子線程是幹不了的,除非自己建立個looper)。因此,有些時候會佔用ui主線程,引起一些問題,所以我們就想到了重新建立個子線程,來處理handler。。。。
使用HandlerThread解決問題
HandlerThread實際上繼承於Thread,只不過它比普通的Thread多了一個Looper。我們可以使用下面的例子建立Handler
HandlerThread thread = new HandlerThread("MyHandlerThread");thread.start();
建立HandlerThread時要把它啟動了,即調用start()方法。
接著就是handler的使用,如下:
mHandler = new Handler(thread.getLooper());//TODO:you can post or send something....
建立Handler時將HandlerThread中的looper對象傳入。那麼這個mHandler對象就是與HandlerThread這個線程綁定了(這時就不再是與UI線程綁定了,這樣它處理耗時操作將不會阻塞UI)。
使用Thread也可以解決問題
只要在子線程中建立個looper執行個體就可以了
其實本人覺得,handler於主線程綁定,未必會阻塞主線程,看了下源碼,發現在主線程中用handler,會自動產生一個子線程。。。
還有如果會引起阻塞,那handler的非同步不就自相矛盾了???
求高人解釋下。。。。。