Handler一定要在主线程实例化吗?new Handler()和new Handler(Looper.getMainLooper())的区别
2016-06-20 10:21
399 查看
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
如果你不带参数的实例化:
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
相关文章推荐
- 解决maillog文件删除后,空间不释放
- 机器学习之(二)OpenAI 生成模型聚焦无监督学习
- 文本查看命令 - head和tail
- QWidget QMainWindow QDialog 之间的区别
- flask-mail常见的邮箱配置问题解决
- 手把手做 raid0()
- http://cometdaily.com/
- TurboMail邮件系统容灾备份方案
- RHEL 7 RAID 5 (软)实验 磁盘阵列
- [转]go中的main函数和init函数
- hotmail收邮件-源码联系我~
- CONTAINING_RECORD
- http://blog.csdn.net/cywosp/article/details/32325449
- logwatch配置笔记
- Rails on Ubuntu常见问题及解决方法
- 172. Factorial Trailing Zeroes
- 出现Lock-Wait锁等待,怎么解决
- 当管理遇上AI,会发生什么
- containsKey方法——判断是否包含指定的键名
- 第十八章 并发登录人数控制——《跟我学Shiro》(http://blog.csdn.net/lhacker/article/details/19334305)