我知道Handler是利用Looper实现消息模式的线程编程的。我也知道一个Handler对应一个Looper,默认的Handler所对应的Looper是UI线程的Looper。
  HandlerThread可以创建一个新的Looper,并且可以讲Handler与该Looper关联起来。但是这既增加了内存开销(我在DDMS上看到HandlerThread下有很多子线程,比如MessageQueue和Looper等),又增加了处理开销(多线程并行)。我写过测试代码,Runnable在HandlerThread中处理比在UI线程中处理要慢3倍!
  那么我们为什么需要HandlerThread呢?或者说新开一个消息队列的Looper有什么好处呢?
  另外通过runOnUiThread方式实现多线程是否比Handler高效?因为这种方式的多线程没有Looper和MessageQueue。求牛人们指点指点。PS:我javaeye没积分了。javaeye的积分真恶心,难挣啊,提了4次问题还没人鸟我。火了,我以后在csdn提问题。

解决方案 »

  1.   

    Android的主线程,也就是UI线程,如果在用户操作5s没有响应,或者广播10s没有响应的情况下会阻塞UI线程,导致提示ANR(Android Not Response);所以需要用Handler来处理耗时任务,例如下载等。
      

  2.   

    (我在DDMS上看到HandlerThread下有很多子线程,比如MessageQueue和Looper等)这些只是线程的模块而已。
    一般对于所有的线程,都是有一个大循环,循环里面收message,然后根据收到的message,处理响应的命令android只不过把这些抽象出来几个类而已:
    大循环是looper,消息就是messagequeue,处理过程就是handler
    主线程由于ANR的限制,一般要做稍微复杂些的东西,都要一个辅助的线程来处理的。
      

  3.   

    freshui你能解释下吗?我不大懂线程模块儿是什么意思。还有请问ANR限制是什么意思呢?是说的那个5秒响应么?
    ameyui朋友你说的对,这个我知道。但是实现线程除了Handler还有其他一些方式。AsycnTask我就很喜欢我写下面的代码:runOnUIThread(
    new Runnable()
    {
    public void run()
    {
    new Thread(){
      public void run()
      {
          //do something
      }
    }.start();
    }
    }
    )不是也新开了一个辅助线程?我在DDMS里看了,的确是新线程。但是为什么这个方法是runOnUIThread(),好诡异啊。
      

  4.   

    HandlerThread创建一个独立的线程,它拥有自己消息循环队列;
    Handler跟一个线程和该线程对应的消息队列绑定,它可以往这个消息队列发送消息或者响应该队列的消息;
    runOnUiThread()是让将要执行的代码放到一个UI线程里面去执行,如果当前线程是UI线程,代码将立即执行;如果当前线程不是UI线程,则将要执行的操作发送到UI线程的消息队列里,等待执行。针对android ANR问题,一般是因为在主线程里执行了长时间的计算,或者复杂的UI呈现。
    因此,可以使用HandlerThread执行复杂的计算,使用runOnUiThread()执行UI操作。Handler只不过是用来在不同线程间通信的机制。
    实际发行,有时候使用HandlerThread还不一定能解决ANR问题,这时候还是得使用Thread了。
      

  5.   

    我现在还是不是能分得清楚handler跟handlerthread的区别啊,求解释
      

  6.   

    HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。这个Looper其实就是对消息队列以及队列处理逻辑的封装,简单说就是 消息队列+消息循环。
    当我们需要一个工作者线程,而不是把它当作一次性消耗品,用过即废弃的话,就可以使用它。Handler在android里负责发送和处理消息。它的主要用途有:
      1)按计划发送消息或执行某个Runnanble(使用POST方法);
      2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)
       默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)、Handler(Looper  looper, Handler.Callback callback) 可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个 Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以 sendMessage。Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在 其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。
      

  7.   

    handler looper Thread 是不是和android系统设计有关啊?