刚接触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的感想吧。