1. 程式人生 > >Handler一定要在主執行緒跑?和脫離主執行緒及HandlerThread的 疑惑

Handler一定要在主執行緒跑?和脫離主執行緒及HandlerThread的 疑惑

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