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

解决方案 »

  1.   

    UI线程中的mainlooper内部loop()方法时同样也是for循环,如果发生阻塞了,当然会影响到UI线程的其它UI操作。其实其它的UI操作也是由loop()来调用的,你其实想弄明白的是这个点吧!
      

  2.   

    可见你对线程间通信还是不了解,现在就是理论知识用到的地方。
    线程间通信有一个消息队列messageQueue,一旦消息队列有消息由looper分发给handle进行处理。
      

  3.   

    而你的UI线程就有一个handle,其实每个线程都有一个唯一处理消息的handle,looper从消息队列messageQueue取出消息,根据消息属于那个线程,分发给那个线程对应的handle所以不会阻塞UI
    线程。但是一个进程只有一个looper。记住线程间通信属于ITC,你可以回去看看你的操作系统理论知识,当然我是结合具体的类给你讲的,理论知识可以不会这么明确,但其实道理都一样。
      

  4.   

    跟你在说明确一点,上面有可能叙述的不好理解。
    你应该知道一个进程有多个线程,每个进程都有一个消息队列,一般程序类名是MessageQueue,一个进程有一个looper负责分发消息给相应的线程,你在UI线程发送消息是发送到MessageQueue消息队列,并不是直接发送给相应的线程,当你发送的消息进入消息队列MessageQueue后,就是由你说的loop()循环查看消息队列MessageQueue有不有消息,如果没有消息就一直循环,当MessageQueue有消息的时候由looper类分发给相应的线程,由这个线程的handle进行处理,这就是线程间通信ITC的全过程。
      

  5.   

    了解下HandlerThread.
      

  6.   


    handler可以有多个,一个线程一个looper.你将looper上升到进程级别的说法,我还是第一次听说。
      

  7.   

    好,按你说一个线程只有一个looper,那一个进程是不是有多个线程??那不每个线程都有一个looper,那还是唯一的吗?我上升到进程,可能是我没说清楚,looper是属于UI主线程,但也就主线程有一个looper,其他没有,我上升到进程是让楼主更容易理解,进程里面就算有n个线程,他也只会在UI主线程里面有一个looper。本来进程就是分解成多个线程,难道我这样说有错吗?难道进程一个线程都没有,还能跑?
      

  8.   


    每一个线程都可以有一个looper,可以有。
      

  9.   

    mainlooper才只有一个。
      

  10.   


    每一个线程都可以有一个looper,可以有。嗯,这一点我刚查了下文档,我理解错了,不好意思,楼主还是听他的说的,我说的这一点是错了。不好意思,差点误人子弟惭愧。
      

  11.   

    关于android消息机制可以查看博客:    
    《Android消息处理机制基础篇》:    http://blog.csdn.net/lc_miao/article/details/77504343     
    《Android消息处理机制原理分析篇》:    http://blog.csdn.net/lc_miao/article/details/77508009