• 第十章:Android消息机制


        Android的消息机制主要是指Handler的云心机制,Handler的运行需要底层的MessageQueue和Looper支持.

        Handler是Android消息机制的上层接口.

        通过Handler可以轻松地将一个任务切换到Handler所在的线程中去执行.

        有时候需要在子线程中执行耗时的I/O操作,可能是读取文件或者访问网络等.

        10.1 Android的消息机制概述

          Android的消息机制主要是指Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作过程.

          Android规定访问UI只能在主线程中进行,如果在子线程中访问UI,那么成句就会抛出异常.

          Handler创建时会采用当前进程的Looper来构建内部的消息循环机制.

          Handler的工作过程:

            

        10.2 Android的消息机制分析

          10.2.1 ThreadLoacl的工作原理

            ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储之后,只能在指定线程中获取到存储的数据.

            采用ThreadLocak可以让监听器座位线程内的全局对象,在线程内部只要通过get方法就可以获取到监听器.

            ThreadLoacl的set和get方法,它们所操作的对象都是当前线程的localValues对象的table数组,因此在不同线程中访问同一个ThreadLoacl的set个get方法,它们对ThreadLocal所做的读/写操作仅限于各自线程的内部.

          10.2.2 消息队列的工作原理

            MessageQueue,主要包含两个操作:插入和读取.

            插入和读取对应的方法分别为enqueueMessage(从消息队列中插入一条消息)和next(从消息队列中取出一条消息并将其从消息队列中移除).

          10.2.3 Looper的工作原理

            Looper在消息机制中扮演着消息循环的角色,具体来说就是它不不停地从MessageQueue中查看是否有新消息,有的话就会立刻处理,否则就一直阻塞在哪里.

            通过Looper.prepare()就可以为当前线程创建一个Looper,接着通过Looper.loop()来开启消息循环.

          10.2.4 Handler的工作原理

            Handler的工作主要包含消息的发送和接收过程.

            消息的发送可以通过post的一些列方法以及send的一系列方法来实现,post的一系列方法最终是通过send的一系列方法来实现的.

            在日常开发中,创建Handler最常见的方式就是派生一个Handler的子类并重写其handleMessage方法来处理具体的消息.

        10.3 主线程的消息循环

          Android的主线程就是ActivityThread,主线程的入口方法为main,在main方法中系统会通过Looper.prepareMainLooper()来闯将主线程的Looper以及MessageQueue,并通过Looper.loop()来开启主线程的消息循环.

          ActivityThread通过ApplicationThread和AMS进行进程间通信,AMS以进程间通信的方式完成ActivityThread的请求后会回调ApplicationThread中的Binder方法

          然后ApplicationThread会向H发送消息,H收到消息后会将ApplicationThread中的逻辑切换到ActivityThread中去执行,即切换到主线程中执行,这个过程就是主线程的消息循环模型.

  • 相关阅读:
    i++ 与++i
    jquery下的domcument
    jquery
    MVC MVP MVVM
    两个for还是一个for?
    华为云服务器FTP连接
    vue-i18n 使用方法
    在本地运行vue build 文件
    vue项目中使用模拟数据 MOCK
    超简单 超详细 vue项目中使用svg图标 阿里巴巴图标库
  • 原文地址:https://www.cnblogs.com/JingQ/p/6186794.html
Copyright © 2020-2023  润新知