解决方案 »

  1.   

    注意这一行
    Looper.prepare();
    如果你把Looper.prepare()注释掉看看是什么结果,一定会报错的
      

  2.   

    是啊,这行不是创建一个looper来接受消息队列里的消息么,可是这个是在子线程中啊,还是和ui线程联系不起来啊?
      

  3.   

    额,我也不懂,哈哈,怎么和你说了,你了解messagequeen,handle,message,looper不,去看下相关的,无论主线程和子线程都公用一个messagequeen,一个主线程的Handler物件,当做Listener去让子线程能将讯息Push到主线程的Message Quene里,以便触发主线程的handlerMessage()函数,让主线程知道子线程的状态,并在主线程更新UI。
      

  4.   

    子线程并没有操作UI线程,代码中子线程用来求素数。
    Looper.prepare()/Looper.loop() 是用来启动一个线程的事件循环,只有这样,才可以在线程中使用 Handler(它依赖事件循环)。
    UI线程在按钮按下时发送消息给子线程,子线程收到消息后开始求素数,求完后使用 Toast 显示。Handler在这里的作用,仅仅是在UI线程和工作线程之间通信。handleMessage() 是运行在工作线程中的。博文决赛,投我一票,谢谢。
      

  5.   

    额,请问handler难道不是定义在子线程中的吗?那他是如何与主线程通信的呢?既然handleMessage() 是运行在工作线程中的,那么他还怎么和ui线程有联系呢?
      

  6.   

    关于如何使用handler,其实本质上就是线程间通信,handler使用的是异步机制,子线程与主线程之间通信是异步的。handler有两个作用:1、发送消息到Loop中的MessageQueue;2、处理Message。它的内部有一个MessageQueue消息队列用于存放handler发送的所有消息,Loop管理MessageQueue,并将消息一个一个地推给handler,handler接收到消息,然后就可以做处理了。这是handler的原理,你可以看一下源码部分,解释的非常清楚。
      

  7.   

    也就是说handler不管在哪个线程都能修改UI线程的是吗?
      

  8.   

    回复8楼的,修改UI线程,只能在UI线程里进行,使用handler是为了在子线程中与UI线程之间建立通信机制,这样子线程可以发送消息到UI线程,通知UI线程做UI修改。