开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
Android的消息机制主要是指Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作过程。
1.消息机制原理的解释:
在主线程里创建一个Handler,然后在分线程中引用这个Handler来发送Message对象给MessageQueue,循环器Looper从MessageQueue里面取出一个需要处理的Message,交给Handler处理,一般是进行UI处理。处理完之后,Message就没有太大的用处,Looper清理Message,让Message回到默认状态。
2.Android的消息机制概述
1.Handler的背景(三个常见问题)
(1)Android为什么要提供Handler?
这是因为Android规定访问UI只能在主线程中进行,如果在子线程中访问UI,那么程序就会抛出异常,但是Android又建议不要在主线程中进行耗时操作,否则会导致线程无法响应即ANR,比如我们需要从服务器拉取一些信息并将其显示在UI上,这个时候必须在子线程中进行拉取工作,拉取完毕后,不能在子线程上直接访问UI,这时候通过Handler就可以将访问UI的操作切换到主线程去执行。
(2)系统为什么不允许在子线程中访问UI呢?
这个因为Android的UI控件并不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态。
(3)为什么系统不对UI控件的访问加上锁机制呢?
缺点有两个:
加上锁机制会让UI访问的逻辑变得复杂 锁机制会降低UI访问的效率,因为锁机制会阻塞某些线程的执行。 鉴于这两个缺点,最简单且高效的方法就是采用单线程模型来处理UI操作。
Handler的工作原理的解释:
子线程默认没有Looper的,如果需要使用Handler,那么在Handler创建时就需要为线程创建Looper,利用Looper来构建内部的消息循环系统,如果当前线程没有Looper,那么就会报错。Handler创建完毕之后,Handler通过post方法把一个Runnable传到Looper中去处理,或者通过send方法发送消息,Looper会调用MessageQueue的enqueueMessage方法将消息发入消息队列中,然后Looper不断循环发现需要处理的消息之后,就会调用消息中的Runnable或者或者Handler的handleMessage方法,这样一来,Handler中的业务逻辑就被切除到创建Handler所在的线程中去执行。