Handler(Android消息处理机制)

  • 一、Why Handler?
    Android中的UI控件是非线程安全的,因此更新UI的操作只能放到UI线程中处理,也就是主线程。Google由此引入了Handler机制来解决这个问题。
  • 二、Handler是什么?
    1.Handler是Android中引入的处理消息循环的一种机制。每个Handler都关联了一个线程,每个线程内部都维护了一个消息队列MessageQueue,这样Handler实际上也就关联了一个消息队列。
    2.可以通过Handler将Message和Runnable对象发送到该Handler所关联线程的MessageQueue(消息队列)中,然后该消息队列不断地循环取出一个Message进行处理。
    3.当创建一个Handler的时候,该Handler就绑定了当前创建Handler的线程。
  • 三、怎么使用?
    1.post()、postDelayed()
    调用Handler的post()方法可以将一个Runnable对象添加到消息队列。
    postDelayed()方法则是可以指定延时添加的时间。
    • 代码示例:
      声明一个Handler对象


      Paste_Image.png

      开启一个新的线程用来模拟延时操作,当业务执行完毕后,调用post()方法,因为Handler绑定的线程就是UI主线程,所以当Handler在合适的时机来处理这条Runnable对象的消息时,就实现了在UI线程更新UI。


      Handler(Android消息处理机制)_第1张图片
      Paste_Image.png

2.使用sendMessage()方法
通过在延时操作的子线程中调用sendMessage()向消息队列发送msg.此外Message对象还可以携带一些数据 简单int,Object,Bundle类型

    • 代码示例:
      首先声明一个Handler的内部类,重写handleMessage()方法
Handler(Android消息处理机制)_第2张图片
Paste_Image.png

然后实例化一个子线程:在耗时业务执行完毕后,想Handler发送一个Message

Handler(Android消息处理机制)_第3张图片
Paste_Image.png
    • 使用sendMessage()的步骤:
    1. 重写Handler的handleMessage方法,根据Message的what值进行不同的处理操作
    2. 创建Message对象
      虽然Message的构造函数式public的,我们还可以通过Message.obtain()或Handler.obtainMessage()来获得一个Message对象(Handler.obtainMessage()内部其实调用了Message.obtain())。
    3. 设置Message的what值
      Message.what是我们自定义的一个Message的识别码,以便于在Handler的handleMessage方法中根据what识别出不同的Message,以便我们做出不同的处理操作。
    4. 设置Message的所携带的数据,简单数据可以通过两个int类型的field arg1和arg2来赋值,并可以在handleMessage中读取。
    5. 如果Message需要携带复杂的数据,那么可以设置Message的obj字段,obj是Object类型,可以赋予任意类型的数据。或者可以通过调用Message的setData方法赋值Bundle类型的数据,可以通过getData方法获取该Bundle数据。
    6. 我们通过Handler.sendMessage(Message)方法将Message传入Handler中让其在handleMessage中对其进行处理。
      需要说明的是,如果在handleMessage中 不需要判断Message类型,那么就无须设置Message的what值;而且让Message携带数据也不是必须的,只有在需要的时候才需要让其携带数据;如果确实需要让Message携带数据,应该尽量使用arg1或arg2或两者,能用arg1和arg2解决的话就不要用obj,因为用arg1和arg2更高效。

.0.

你可能感兴趣的:(Handler(Android消息处理机制))