new Handler()和new Handler(Looper.getMainLooper())的區別是什么?
一、Handler的一些知識,new Handler()和new Handler(Looper.getMainLooper())的區別
如果你不帶參數的實例化:Handler handler = new Handler();那么這個會默認用當前線程的looper,在代碼中Handler的定位是用來刷新操作UI,這樣的話需要在主線程中操作。
下面分為幾種情況來分析Handler的:
1.更新UI界面,handler要用到主線程的looper。那么在主線程 Handler handler = new Handler();如果在其他線程,也要滿足這個功能的話,要Handler handler = new Handler(Looper.getMainLooper());
2.只進行處理消息操作。 當前線程如果是主線程的話,使用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/2445395.html
http://www.cnblogs.com/xpxpxp2046/archive/2012/04/13/2445355.html
轉載來源:
https://blog.csdn.net/thanklife/article/details/17006865