Handler一定要在主線程實例化嗎?new Handler()與new Handler(Looper.getMainLooper())

一個帖子的整理:

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();過,其他線程需要手動調用這兩個,否則會報錯。

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.html



兩篇不錯的文章:

http://www.cnblogs.com/xpxpxp2046/archive/2012/04/13/2445395.html

http://www.cnblogs.com/xpxpxp2046/archive/2012/04/13/2445355.html


發佈了3 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章