本帖最后由 zzj123 于 2017-6-14 14:38 编辑
Handler 机制
Handler 机制
Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信。之所以需要跨线程通信是因为在 Android 中主线程通常只负责 UI 的创建和修改,子线程负责网络访问和耗时操作,因此,主线程和子线程需要经常配合使用才能完成整个 Android 功能。
Handler 机制可以近似用图 1-2 展示。MainThread 代表主线程,newThread 代表子线程。
MainThread 是 Android 系统创建并维护的,创建的时候系统执行了 Looper.prepare();方法,该方法内部
创建了 MessageQueue 消息队列(也叫消息池),该消息队列是 Message 消息的容器,用于存储通过 handler
发送过来的 Message。MessageQueue 是 Looper 对象的成员变量,Looper 对象通过 ThreadLocal 绑定在 MainThread 中。因此我们可以简单的这么认为:MainThread 拥有唯一的一个 Looper 对象,该 Looper 对象有用唯一的 MessageQueue 对象,MessageQueue 对象可以存储多个 Message。
MainThread 中需要程序员手动创建 Handler 对象,并覆写 Handler 中的 handleMessage(Message msg)
方法,该方法将来会在主线程中被调用,在该方法里一般会写与 UI 修改相关的代码。
MainThread 创建好之后,系统自动执行了 Looper.loop();方法,该方法内部开启了一个“死循环”不断
的去之前创建好的 MessageQueue 中取 Message。如果一有消息进入 MessageQueue,那么马上会被Looper.loop();取出来,取出来之后就会调用之前创建好的 handler 对象的 handleMessage(Message)方法。
newThread 线程是我们程序员自定 new 出来的子线程。在该子线程中处理完我们的“耗时”或者网络访问任务后,调用主线程中的 handler 对象的 sendMessage(msg)方法,该方法一被执行,内部将就 msg 添加到了主线程中的 MessageQueue 队列中,这样就成为了 Looper.loop()的盘中餐了,等待着被消费。
上面的过程有点类似黑马 Java 基础班学习多线程时的生产者和消费者的过程。newThread 属于生产者,负责生产 Message,MainThread 属于消费者。这是一个很复杂的过程,但是 Android 显然已经将这种模式
给封装起来了,就叫 Handler 机制。我们使用时只需要在主线程中创建 Handler,并覆写 handler 中的 handleMessage 方法,然后在子线程中调用 handler 的 sendMessage(msg)方法即可。
获取 Message 的多种写法
在Hanlder 机制中都需要用到 Message 对象,该对象的创建或者获取有多种方式。
1. Message msg = new Message(); 直接创建一个新的 Message 对象。
2. Message msg = handler.obtainMessage(); 通过 handler 对象获取一个 Message 对象,该对象从消息缓
存池中获取的,可以提高 Message 的使用率,减少垃圾回收次数。
3. handler.post(Runnable r); post()方法中传递一个 Runnable 对象,那么该对象会被主线程执行。该
方法表面上看跟 Message 没任何关系,但是其内部帮我们封装了 Message。
|
|