消息关闭
    暂无新消息!
如题,我们在非UI中处理消息时,需要调用loop()方法,通过里面的for循环取出消息进行分派处理。
而在UI线程中我们只需指定Handler即可发送和处理消息。那请问UI线程中是如何取得消息的呢,如果也是用for循环,那发生阻塞了就会影响到UI响应时间,还是通过别的机制?求大牛们解答。。。。

9个回答

︿ 3
可见你对线程间通信还是不了解,现在就是理论知识用到的地方。
线程间通信有一个消息队列messageQueue,一旦消息队列有消息由looper分发给handle进行处理。
︿ 2
好,按你说一个线程只有一个looper,那一个进程是不是有多个线程??那不每个线程都有一个looper,那还是唯一的吗?我上升到进程,可能是我没说清楚,looper是属于UI主线程,但也就主线程有一个looper,其他没有,我上升到进程是让楼主更容易理解,进程里面就算有n个线程,他也只会在UI主线程里面有一个looper。本来进程就是分解成多个线程,难道我这样说有错吗?难道进程一个线程都没有,还能跑?
︿ 1
跟你在说明确一点,上面有可能叙述的不好理解。
你应该知道一个进程有多个线程,每个进程都有一个消息队列,一般程序类名是MessageQueue,一个进程有一个looper负责分发消息给相应的线程,你在UI线程发送消息是发送到MessageQueue消息队列,并不是直接发送给相应的线程,当你发送的消息进入消息队列MessageQueue后,就是由你说的loop()循环查看消息队列MessageQueue有不有消息,如果没有消息就一直循环,当MessageQueue有消息的时候由looper类分发给相应的线程,由这个线程的handle进行处理,这就是线程间通信ITC的全过程。
︿ 1
UI线程中的mainlooper内部loop()方法时同样也是for循环,如果发生阻塞了,当然会影响到UI线程的其它UI操作。

其实其它的UI操作也是由loop()来调用的,你其实想弄明白的是这个点吧!
︿ 0
而你的UI线程就有一个handle,其实每个线程都有一个唯一处理消息的handle,looper从消息队列messageQueue取出消息,根据消息属于那个线程,分发给那个线程对应的handle所以不会阻塞UI
线程。但是一个进程只有一个looper。记住线程间通信属于ITC,你可以回去看看你的操作系统理论知识,当然我是结合具体的类给你讲的,理论知识可以不会这么明确,但其实道理都一样。
︿ 0
关于android消息机制可以查看博客:    
《Android消息处理机制基础篇》:    http://blog.csdn.net/lc_miao/article/details/77504343     
《Android消息处理机制原理分析篇》:    http://blog.csdn.net/lc_miao/article/details/77508009