Android--Handler(承担着子线程和主线程之间的通信)

来源:互联网 发布:淘宝助手怎么下架宝贝 编辑:程序博客网 时间:2024/04/27 16:02

Handler类出现的背景:

当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件, 进行事件分发,


比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。  如果此时需要一个耗时的操作,


例如: 联网读取数据,    或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中


的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示  "强制关闭"。  这个时候


我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,,Android主线程是线程不安全的, 也就是说,


更新UI只能在主线程中更新,子线程中操作是危险的。 这个时候,Handler就出现了。,来解决这个复杂的问题 ,


由于Handler运行在主线程中(UI线程中),  它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受


子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主
线程进行更新UI。




Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,

而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的

处理。 这种机制通常用来处理相对耗时比较长的操作。

主要特点:

 1、传递Message。用于接收子线程发送的数据,并用此数据配合主线程更新UI

  在Android中,对于UI的操作通常需要放在主线程中进行操作。如果在子线程中有关于UI的操作,

  那么就需要把数据消息作为一个Message对象发送到消息队列中,然后,由Handler中的handlerMessage方法
  
  处理传过来的数据信息,并操作UI。当然,Handler对象是在主线程中初始化的,因为它需要绑定在主线程的
  
  消息队列中。类sendMessage(Message msg)方法实现发送消息的操作。 在初始化Handler对象时重写的handleMessage方法

      来接收Message并进行相关操作。

 2. 传递Runnable对象。用于通过Handler绑定的消息队列,安排不同操作的执行顺序。


  Handler对象在进行初始化的时候,会默认的自动绑定消息队列。利用类post方法,可以将Runnable对象发送到消息队列中

  按照队列的机制按顺序执行不同的Runnable对象中的run方法。





Message 可以传递的参数有:

1. arg1 arg2 整数类型,是setData的低成本替代品。传递简单类型

2. Object 类型 obj

3. what  用户自定义的消息代码,这样接受者可以了解这个消息的信息。每个handler各自包含自己的消息代码,

所以不用担心自定义的消息跟其他handlers有冲突。



0 0
原创粉丝点击