一个帖子的整理: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对象