handler的一些测试

刚接触handler,很多不能理解,网上找了一些资料,把觉得有用的总结了一些


首先,重要的一点,线程不能多次启动,第一次启动会有一个状态,表示线程已经启动,如果再次启动,会报错。

04-12 03:42:49.186: E/AndroidRuntime(662): java.lang.IllegalThreadStateException: Thread already started.
04-12 03:42:49.186: E/AndroidRuntime(662): at java.lang.Thread.start(Thread.java:1322)


消息的归属者区分:一个是消息队列,一个是发送消息的handler


引自:点击打开链接

总结:

1.handler的作用(为什么使用handler):

1)按计划发送消息或执行某个Runnanble(使用POST方法),类似定时器
2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程);

2.当handler在一个线程中创建,就会与他所在的线程和消息队列进行绑定;

3.一个线程对应一个Looper(消息循环),一个MessageQueue(消息队列)

4.一个线程中可以对应多个handler,但是共用一个Looper和MessageQueue;

5.handler可以从任何线程发送消息(前提必须有looper实例);



引自:点击打开链接

Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个事android的新 概念。我们的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handle,我们有消息循环,就要往消息循环里 面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,消息的的处理,把这些都封装在Handle里面,注意Handle只是针对那 些有Looper的线程,不管是UI线程还是子线程,只要你有Looper,我就可以往你的消息队列里面添加东西,并做相应的处理。 但是这里还有一点,就是只要是关于UI相关的东西,就不能放在子线程中,因为子线程是不能操作UI的,只能进行数据、系统等其他非UI的操作。


后来想了想,如果有两个线程,这里的消息 ,handler该怎么去取,本想debug实际看看,结果断点竟然不会停下来,一直没搞懂,只能进行一些推断,

结果:如果两个线程都有各自的handler,则由

handler.sendEmptyMessage(2);

这里的handler处理这个消息

推断:每个线程都有各自的   loop,在自己线程中sendmessage,是把消息送到自己的loop中,但是如果改写run()方法的时候加上这一句

Looper.prepareMainLooper();
那么会使两格线程公用一个looper,如果在含有这一句代码的线程  的构造方法中传入其他线程的handler,则可以有其他线程的handler处理此线程的sendmessage。

这里实质上,就是  其他线程(handler1.sendEmptyMessage(2);)发送消息,这个线程(handler1)处理消息。


第一次写这个,感觉有些乱,作为一些使用handler的感想吧。

代码下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值