Android收发消息过程介绍

作者: 2c3d4f7ba0d4 | 来源:发表于2019-07-31 18:01 被阅读7次

在Android中,只能通过主线程更新UI。而主线程中又不能进行耗时操作,不然就会报ANR(无响应)。那么耗时操作就只能放到子线程中去完成,完成后再通知主线程去更新UI。

那么子线程如何通知主线程呢?Android提供了Handler来实现这个操作。

Handler不仅能进行主线程之间、主线程与子线程之间还能进行子线程与子线程之间进行通信。那么它是如何实现的呢?在使用Handler的过程中有四个对象非常重要:Handler、Looper、Message、MessageQueue、ThreadLocal(用于存储Thread全局的本地变量)

在子线程创建Handler的时候需要在创建前调用Looper.prepare(),使用后调用Looper.loop()方法。不然Handler没法使用,两个都是必须的。如果Looper.prepare()没调用就会报异常,如果Looper.prepare()调用了而Looper.loop()没有调用handleMessage中就收不到消息。为什么呢?在Handler的构造函数中会判断调用Looper的myLooper,而在Handler的构造函数中会判断Looper是否为空,如果为空就会抛出异常。Looper对象中有一个loop()方法,这个方法中有一个死循环,从MesssageQueue中取出Message,并通过Handler把消息分发出去。

那么我们在主线程中创建Handler的时候为什么不用调用Looper.prepare()和Looper.loop()呢?因为App在启动的时候在Activity中的ActivityThread中已经帮我们创建好了,所以能够直接使用。

Handler通过sendMessage发送消息,并把Message存入MessageQueue。通过Loop的loop()方法把Message从MessageQueue中取出来,并通过Handler分发出去。

在创建在创建Looper.prepare()的的时候,会创建一个MessageQueue。ThreadLocal会把这个创建好的Looper存储起来。

相关文章

  • Android收发消息过程介绍

    在Android中,只能通过主线程更新UI。而主线程中又不能进行耗时操作,不然就会报ANR(无响应)。那么耗时操作...

  • Android体系复习---广播

    一、广播简介 Android 应用与 Android 系统和其他 Android 应用之间可以相互收发广播消息,这...

  • IM - 核心功能之消息收发和MQ设计

    1. 概述 本文继续介绍IM系统核心功能之二,分别是 消息收发 RabbitMQ设计 2. 消息收发流程 流程图 ...

  • linux系统下SCTP消息收发函数

    这里介绍的两个SCTP收发消息的函数极大的简化了基于SCTP协议的消息收发,可以更加容易的去使用一些SCTP协议的...

  • IM消息收发

    接收消息 接口设计 如果需要感知新消息的通知,可以注册消息通知回调IIMMsgListener。新消息到来时,on...

  • iOS蓝牙4.0,后台监听来电

    在上一篇文章《iOS蓝牙4.0收发数据设计》,有简单的介绍收发数据设计。在iOS蓝牙4.0开发过程中,肯定还有许多...

  • Eddy的AI小助手-微信消息收发(6)

    微信消息收发规范 微信使用POST请求形式来收发消息,消息以XML形式进行封装, 微信消息类型 消息类型包括: 文...

  • Handler 我必须知道的一切

    Android提供的 Handler 消息收发处理机制,其根本目的就是解决多线程并发的问题,与之关联的 Loope...

  • Android----Handler消息机制

    csdn 个人博客 Android----Handler消息机制(进阶篇) 一.简单介绍 Android 中的消息...

  • uniapp实现IM即时通讯仿微信聊天功能

    本文介绍如何基于 UNIAPP 使用 即时通讯SDK ZIM SDK 快速实现基本的消息收发功能。 1 uniap...

网友评论

    本文标题:Android收发消息过程介绍

    本文链接:https://www.haomeiwen.com/subject/ppatdctx.html