您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

Android 异步消息处理机制解析

时间:2019-10-31 14:11:36  来源:  作者:
Android 异步消息处理机制解析

 

Android 中的异步消息处理主要由四个部分组成,Message、Handler、MessageQueue、Looper。下面将会对这四个部分进行一下简要的介绍。

1.Message:

Message 是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。通常使用 Message 的 what 字段携带命令,除此之外还可以使用 arg1 和arg2 字段来携带一些整形数据,使用 obj 字段携带一个 Object 对象。

2.Handler:

Handler 顾名思义也就是处理者的意思,它主要是用于发送和处理消息的。发送消息一般是使用 Handler 的 sendMessage()方法,而发出的消息经过一系列地辗转处理后,最终会传递到 Handler 的 handlerMessage()方法中。

3.MessageQueue:

MessageQueue 是消息队列的意思,它主要用于存放所有通过 Handler 发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程中只会有一个 MessageQueue 对象。

4.Looper:

Looper 是每个线程中的 MessageQueue 的管家,调用 Looper 的 loop() 方法后,就会进入到一个无限循环当中,然后每当发现 MessageQueue 中存在一条消息,就会将它取出,并传递到 Handler 的 handleMessage() 方法中。每个线程中也只会有一个 Looper 对象。

异步消息处理流程

Android 异步消息处理机制解析

 


Android 异步消息处理机制解析

 

首先需要在主线程当中创建一个 Handler 对象,并重写 handleMessage() 方法。然后当子线程中需要进行UI操作时,就创建一个 Message 对象,并通过 Handler 将这条消息发送出去。之后这条消息会被添加到 MessageQueue 的队列中等待被处理,而 Looper 则会一直尝试从 MessageQueue 中取出待处理消息

最后分发回 Handler 的 handleMessage() 方法中。

由于 Handler 是在主线程中创建的,所以此时 handleMessage() 方法中的代码也会在主线程中运行,于是就可以安心地进行UI操作了。

Android 异步消息处理机制解析

 

一条 Message 经过这样一个流程的辗转调用后,也就从子线程进入到了主线程,从不能更新 UI 变成了可更新 UI,整个异步消息处理的核心思想也就如此。

Android 异步消息处理机制解析

 

使用AsyncTask

为了更加方便我们在子线程中对 UI 进行操作,Android 还提供了另外一些好用的工具,AsyncTask 就是其中之一。借助 AsyncTask,即使你对异步消息处理机制完全不了解,也可以十分简单地从子线程切换到主线程。当然,AsyncTask 背后的实现原理也是基于异步消息处理机制的,只是 Android 做了很好的封装而已。

AsyncTask 的基本用法:

首先来看一下 AsyncTask 的基本用法,由于 AsyncTask 是一个抽象类,所以如果我们想使用它,就必须创建一个子类去继承它。

在继承时我们可以为 AsyncTask 类指定三个泛型参数,这三个参数的用途如下:

Params:在执行 AsyncTask 时需要传入的参数,可用于在后台任务中使用。

Progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。

Result:当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。

因此,一个最简单定义的AsyncTask就可以写成以下形式:

class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
 ...
 }
}
Android 异步消息处理机制解析

 

经常需要重写的方法还有下面4个。

  • onPreExecute():

这个方法会在后台任务开始执行之前调用,用于进行一些界面上的初始化操作,比如显示一个进度条对话框等。

  • doInBackground(Params…):

这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理所有的耗时任务。注意,在这个方法中是不可以进行 UI 操作的。

  • onProgressUpdate(Progress…):

当后台任务中调用了 publishProgress(Progress…)方法后,这个方法就会很快被调用,方法中携带的参数就是在后台任务中传递过来的。在这个方法中可以对UI 进行操作,利用参数中的数值就可以对界面元素进行相应地更新。

  • onPostExecute(Result):

当后台任务执行完毕并通过 return 语句进行返回时,这个方法就很快会被调用。返回的数据会作为参数传递到此方法中,可以利用返回的数据来进行一些 UI操作,比如提醒任务执行的结果,以及关闭掉进度条对话框等。

因此一个完整的自定义AsyncTask可以写成一下格式:

Android 异步消息处理机制解析

 

简单来说,使用 AsyncTask 的诀窍就是,在 doInBackground() 方法中去执行具体的耗时任务,在 onProgressUpdate() 方法中进行 UI 操作,在 onPostExecute()方法中执行一些任务的收尾工作。

如果想要启动这个任务,只需编写以下代码即可:

  • new DownloadTask.execute();

以上就是 AsyncTask 的基本用法。我们并不需要去考虑异步消息处理机制,也不需要专门使用一个 Handler 来发送和接收消息,只需要调用一下 publishProgress()方法就可以轻松地从子线程切换到 UI 线程了。、

今年年初我花一个月的时间收录整理了一套知识体系,如果有想法深入的系统化的去学习的,可以私信我【安卓,我会把我收录整理的资料都送给大家,帮助大家更快的进阶。



Tags:Android   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除,谢谢。
▌相关推荐
6 月 29 日,微软向 Windows 预览体验计划的 Dev 通道推送了 Windows 11 的第一个预览版本,我们也在第一时间升级到了最新系统,可以点击这里查看 APPSO 的抢先体验。 关于 Windo...【详细内容】
2021-07-14  Tags: Android  点击:(5)  评论:(0)  加入收藏
玩过王者荣耀的朋友,几乎无人不晓「鲁班七号」这个英雄。作为 Android 的应用程序包,「APK」对于资深 Android 用户来说,知名度并不亚于前者。 也正因如此,日前 Google 的一份声...【详细内容】
2021-07-08  Tags: Android  点击:(5)  评论:(0)  加入收藏
作者:leafjia,腾讯WXG客户端开发工程师你真的了解Android的线程优先级吗? 看似平平无奇的三行代码却隐藏着巨大的陷阱!Android上如果在主线程执行下面的代码:Thread t = new Thre...【详细内容】
2021-06-18  Tags: Android  点击:(25)  评论:(0)  加入收藏
一、前言最近参加了几轮面试,发现很多5-7年工作经验的候选人在性能优化这一块,基本上只能说出传统的分析方式,例如ANR分析,是通过查看/data/anr/ 下的log,分析主线程堆栈、cpu、...【详细内容】
2021-06-17  Tags: Android  点击:(29)  评论:(0)  加入收藏
随着加密技术的不断升级,设备数据破解的攻防战也在不断升级。比如在打击犯罪的时候,警方可能非常需要查看嫌疑人手机中的内容,以 Cellebrite 为代表的取证工具就此应用而生。不...【详细内容】
2021-05-14  Tags: Android  点击:(86)  评论:(0)  加入收藏
最近在思考一个问题,对于技术人员来说,护城河是什么呢?我想通常答案应该是技术比别人强。那我们说一个人技术比别人强到底指的是什么?哪里比别人强呢?在我看来一点是在某个技术领...【详细内容】
2021-04-20  Tags: Android  点击:(114)  评论:(0)  加入收藏
前言Coil 是一个非常年轻的图片加载库,在 2020 年 10 月 22 日才发布了 1.0.0 版本,但却受到了 Android 官方的推广,在 Android Developers Backstage 这个博客中专门聊过一期...【详细内容】
2021-04-20  Tags: Android  点击:(113)  评论:(0)  加入收藏
然后我们再来看看,androidstudio的布局编辑器的使用. 可以先打开layout中的一个xml去看看,右边有所见即所得的编辑器,以前用eclipse,都是跑起来看,太麻烦了. ​可以看...【详细内容】
2021-04-14  Tags: Android  点击:(114)  评论:(0)  加入收藏
作为一个相当完善的移动操作系统,Android 系统涉及到很多组件。如果宽泛的来讲可以分成两大部分,应用生态和操作系统本身。而对于开发者来说,所选择的编程语言会根据正在开发的...【详细内容】
2021-04-07  Tags: Android  点击:(109)  评论:(0)  加入收藏
本文旨在讲解如何在Android平板或手机上搭建Python开发环境,帮助Python初学者有效利用碎片化时间进行学习,从而达到良好的学习效果。对于大部分初学Python的人来说,由于工作、...【详细内容】
2021-03-24  Tags: Android  点击:(176)  评论:(0)  加入收藏
▌简易百科推荐
作者:leafjia,腾讯WXG客户端开发工程师你真的了解Android的线程优先级吗? 看似平平无奇的三行代码却隐藏着巨大的陷阱!Android上如果在主线程执行下面的代码:Thread t = new Thre...【详细内容】
2021-06-18  leafjia  腾讯技术工程  Tags:Android   点击:(25)  评论:(0)  加入收藏
一、前言最近参加了几轮面试,发现很多5-7年工作经验的候选人在性能优化这一块,基本上只能说出传统的分析方式,例如ANR分析,是通过查看/data/anr/ 下的log,分析主线程堆栈、cpu、...【详细内容】
2021-06-17  Android面试通    Tags:Android   点击:(29)  评论:(0)  加入收藏
随着加密技术的不断升级,设备数据破解的攻防战也在不断升级。比如在打击犯罪的时候,警方可能非常需要查看嫌疑人手机中的内容,以 Cellebrite 为代表的取证工具就此应用而生。不...【详细内容】
2021-05-14    cnBeta  Tags:Android应用   点击:(86)  评论:(0)  加入收藏
最近在思考一个问题,对于技术人员来说,护城河是什么呢?我想通常答案应该是技术比别人强。那我们说一个人技术比别人强到底指的是什么?哪里比别人强呢?在我看来一点是在某个技术领...【详细内容】
2021-04-20  像程序那样思考  今日头条  Tags:Android研发   点击:(114)  评论:(0)  加入收藏
前言Coil 是一个非常年轻的图片加载库,在 2020 年 10 月 22 日才发布了 1.0.0 版本,但却受到了 Android 官方的推广,在 Android Developers Backstage 这个博客中专门聊过一期...【详细内容】
2021-04-20  愿天堂没有代码  今日头条  Tags:Kotlin-First   点击:(113)  评论:(0)  加入收藏
然后我们再来看看,androidstudio的布局编辑器的使用. 可以先打开layout中的一个xml去看看,右边有所见即所得的编辑器,以前用eclipse,都是跑起来看,太麻烦了. ​可以看...【详细内容】
2021-04-14  梦幻神域  今日头条  Tags:   点击:(114)  评论:(0)  加入收藏
作为一个相当完善的移动操作系统,Android 系统涉及到很多组件。如果宽泛的来讲可以分成两大部分,应用生态和操作系统本身。而对于开发者来说,所选择的编程语言会根据正在开发的...【详细内容】
2021-04-07  cnBeta  今日头条  Tags:Rust编写   点击:(109)  评论:(0)  加入收藏
安卓12开发者预览版1已经出来一段时间了,我们已经对它带来的变化有了很好了解。我们还了解到,DP1采用了隐藏式的系统设置设计,灵感来自于三星One UI。此外,安卓12可能会带来一个...【详细内容】
2021-03-02      Tags:Android 12   点击:(97)  评论:(0)  加入收藏
安卓是谷歌将它从开源linux上改造而来,依旧保持开源特性。为了应用开发者更多地开发安卓程序,自然也就保留了linux上的虚拟机机制。同时,安卓的目标是手机等移动终端,这些设备的...【详细内容】
2021-02-08      Tags:Android   点击:(107)  评论:(0)  加入收藏
由于工作需要,需要解决一些性能问题,虽然有 Profiler 、Systrace 等工具, 但是无法实时监控,于是计划写一个能实时监控性能的小工具,经过学习大佬们的文章, 最终完成了这个开源的...【详细内容】
2021-01-14      Tags:Android   点击:(48)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条