一個帖子的整理:html
Handler必定要在主線程實例化嗎?new Handler()和new Handler(Looper.getMainLooper())的區別
若是你不帶參數的實例化:Handler handler = new Handler();那麼這個會默認用當前線程的looper
通常而言,若是你的Handler是要來刷新操做UI的,那麼就須要在主線程下跑。
狀況:
1.要刷新UI,handler要用到主線程的looper。那麼在主線程 Handler handler = new Handler();,若是在其餘線程,也要知足這個功能的話,要Handler handler = new Handler(Looper.getMainLooper());
2.不用刷新ui,只是處理消息。 當前線程若是是主線程的話,Handler handler = new Handler();不是主線程的話,Looper.prepare(); Handler handler = new Handler();Looper.loop();或者Handler handler = new Handler(Looper.getMainLooper());
如果實例化的時候用Looper.getMainLooper()就表示放到主UI線程去處理。
若是不是的話,由於只有UI線程默認Loop.prepare();Loop.loop();過,其餘線程須要手動調用這兩個,不然會報錯。
oop
message.what,message.arg1,message.arg2,message.obj,他們在之間有什麼區別呢?
what就是通常用來區別消息的,好比你傳進去的時候msg.what = 3;
而後處理的時候判斷msg.what == 3是否是成立的,是的話,表示這個消息是幹嗎幹嗎的(本身能區別開)
至於arg1,arg2,其實也就是兩個傳遞數據用的,兩個int值,看你本身想要用它幹嗎咯。若是你的數據只是簡單的int值,那麼用這兩個,比較方便。
其實這裏你還少說了個,setData(Bundle),上面兩個arg是傳遞簡單int的,這個是傳遞複雜數據的。
msg.obj呢,這個就是傳遞數據了,msg中可以攜帶對象,在handleMessage的時候,能夠把這個數據取出來作處理了。不過呢,若是是同一個進程,最好用上面的setData就好了,這個通常是Messenger類來用來跨進程傳遞可序列化的對象的,這個比起上面的來,更消耗性能一些。性能
http://www.cnblogs.com/xpxpxp2046/archive/2012/04/13.htmlui
兩篇不錯的文章:線程
http://www.cnblogs.com/xpxpxp2046/archive/2012/04/13/2445395.htmlhtm
http://www.cnblogs.com/xpxpxp2046/archive/2012/04/13/2445355.html對象