一 .介绍 :  Handler 是 android 消息机制的上层“接口”,一般情况下我们只需要和 Handler 进行交互即可。在什么情况下我们使用消息传递呢? 例如,在子线程中进行操作(网络请求 , 复杂的计算 , 复杂的数据库操作 等等),然后需要根据在子线程中的结果来相应的更新UI ,那么这时就需要使用 Handler 在UI线程中更新界面。(Android 不允许在子线程中更新或修改UI)。

Android 的消息机制主要指 Handler 的运行机制 ,而 Handler 需要MessageQueue 与 Looper 。
MessageQueue 的翻译是消息队列 , 它的内部是储存一组消息,以队列的形式对外提供插入 和 删除的功能 (虽然叫消息队列,但是它内部存储结构并不是真正的队列。而是采用单列表的数据结构来存储消息列表)。


Looper 是循环的意思 , 可以理解为消息循环 ,因为MessageQueue 只是一个消息存储单元 ,并不具有处理消息的功能,所以Looper 填补了这一功能 。 Looper会以无限循环的方式不断的查询是否有新消息,如果有就处理 。

Looper中有个特殊的--- ThreadLocal , 首先它不是线程 ,虽然名字像... 它的作用是在每个线程中存储数据,ThreadLocal 可以在不同线程中可以互不干扰地存储并提供数据 , 通过ThreaLocal 可以获取Looper 。


注意 : 线程默认是没有Looper 的,如果需要使用 Handler 就必须为线程创建Looper 。我们之所以能在UI线程中使用,是因为 已经在ActivityThread被创建时就会初始化Looper 。

二 . 工作流程介绍 :

创建完 Handler 后,这个时候其内部的Looper 和MessageQueue 就可以一起协同工作了 。 Handler 通过post 将一个Runnable投递到Handler内部的Looper中去处理,亦可以 send 发送一条消息 , 这个消息同样也是在Looper中处理(其实post 最终也是 send 方法来完成的)。当Handler 的 send 方法被调用时 , 它会调用MessageQueue 的 enqueueMessage 方法,将这个消息放入到消息队列中,然后Looper 发现有新消息时, 就会处理这个消息,最终消息中的Runnable 或者 Handler 的handleMessage 方法就会被调用 。 

注意 : Looper 是运行在Handler所在的线程中的,这样一来Handler 中的业务逻辑就被切换到了创建Handler所在的线程中执行了。

Android service 传递消息 安卓消息传递机制_子线程


三. 如何在没有Looper 的线程中使用 Handler 

<span style="font-size:14px;"> new Thread(new Runnable() {
            @Override
            public void run() {
           
                Looper.prepare();
                Handler handler =new Handler();
                Looper.loop();
            }
        }).start();
    }</span>


主要是创建Looper 对象,调用Looper 的 prepare ,在调用 loop 就行了