读书人

Handler: 主线程怎么通知子线程(转)

发布时间: 2012-06-27 14:20:09 作者: rapoo

Handler: 主线程如何通知子线程(转)

? ? ? 在 android 中,不可以在子线程中更新 UI 的操作,否则会报错或者异常信息。在这种情况下,我们会使用 Handler(在 UI 线程创建该对象) 接收子线程的消息更新 UI.可以看出,这是子线程通知主线程,而主线程没有直接通知子线程,那麽我们如何做到这一点?这样有什么好处?好处,很明显。主线程中如果有些耗时的操作,我们可以让子线程去做,这时,主线程就可以通知子线程了!

? ? ? ? 实现这种操作的方式有很多,今天主要想说说 HandlerThread 与 Handler 的配合使用方法。在主线程中,可以创建 HandlerThread 对象:

?

?最后,使用 Message 来传递消息,MyHandler 会根据情况处理 Message.

完整代码:

?

?这里,我们思考一个问题,代码:

?

  1. //?获取?Looper?对象??
  2. MyHandler?mHandler?=?new?MyHandler(mHandlerThread.getLooper());??


获取 Looper 对象,使用的是 HandlerThread 对象的 getLooper 对象。为什么不直接这样:

?

?

  • //?获取?Looper?对象??
  • MyHandler?mHandler?=?new?MyHandler(getMainLooper());??


    如果这样做的话,打印信息如下:

    ?

    ?

  • D/mark????(21852):?UI----threadName:?main,threadId:?1??
  • D/mark????(21852):?handleMessage---threadName:?main,threadId:?1??
  • D/mark????(21852):?我接受任务:我这边事情太多,麻烦你帮忙处理一下!??


    可见,此时的 handleMessage 是在主线程中运行的。每个主线程默认有一个 Looper,也就是说在主线程中,下面代码是等效的:

    ?

    ?

  • MyHandler?mHandler?=?new?MyHandler(getMainLooper());??
  • ??
  • MyHandler?mHandler?=?new?MyHandler();??


    但是子线程需要手动获取如:

    ?

    ?

  • MyHandler?mHandler?=?new?MyHandler(mHandlerThread.getLooper());??


    实现主线程、子线程双向通信可以在各自的线程中分别是用 Handler 来传递信息和处理消息。

  • 读书人网 >移动开发

    热点推荐