android handler机制简单介绍
我们需要了解4个类:
- handler:处理者,用于发送和接收信息
- massage:消息.里面可以存储消息的许多信息
- looper:循环泵,用于循环取出消息队列中的消息
- MessageQueue(一般不直接接触):消息队列,存储handler发来的消息,先进先出原则(队列)
其实整个机制的过程可以简单概括就是:handler发送一个massage,进入MessageQueue,后依据先进先出取出massage,然后处理massage.
这里面,负责发送消息的是handler,处理消息的也是handler,只需要用回调函数就可以实现,要处理信息的时候,只需要执行该回调即可[handleMessage],然后是如何实现不停的从消息队列中取得massage的呢,这时候就是Looper发挥作用的时候了,Looper中有一个while(true),来实现一直从消息队列中获取massage,获取到之后,只需要使用对应的回调函数,就可以处理消息了.
首先说下looper,实际上每个thread都配有一个looper,也只能有一个,默认状态下的looper是不启动的,activity中已经默认启动,用于一些UI刷新相关工作,如果我们要在我们自己写的thread中启动looper,参照以下代码,执行prepared和loop即可
public class LooperThread extends Thread {
@Override
public void run() {
// 初始化looper
Looper.prepare();
// ...其他处理
// 开始循环处理消息队列
Looper.loop();
}
}
我们再来看看handler,handler用于发送和处理消息,要注意的是,new handler之前,需要确保所在thread已经初始化Looper,否则handler无法正确处理消息,原因从上面说的可以看出,没有looper的循环,是无法读取消息队列的
再看massage,massage用于存储需要处理的信息,massage中有许多地方可以储存数据,obj,what等
MessageQueue,简单理解就是一个消息队列.
总结下:
一个thread对应一个looper
一个looper可以对应多个handler
一个looper对应一个MessageQueue
android handler机制简单介绍的更多相关文章
- Android Handler 机制总结
写 Handler 原理的文章很多,就不重复写了,写不出啥新花样.这篇文章的主要是对 handler 原理的总结. 1.Android消息机制是什么? Android消息机制 主要指 Handler ...
- Android Handler机制剖析
android的handler机制是android的线程通信的核心机制 Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃. Android中的实现了 接收消息的& ...
- Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)
转载自http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长 ...
- Android Handler机制彻底梳理
Android的消息机制其实也就是Handler相关的机制,对于它的使用应该熟之又熟了,而对于它的机制的描述在网上也一大堆[比如15年那会在网上抄了一篇https://www.cnblogs.com/ ...
- Android Handler 机制 - Looper,Message,MessageQueue
Android Studio 2.3 API 25 从源码角度分析Handler机制.有利于使用Handler和分析Handler的相关问题. Handler 简介 一个Handler允许发送和处理M ...
- android Handler机制之ThreadLocal详解
概述 我们在谈Handler机制的时候,其实也就是谈Handler.Message.Looper.MessageQueue之间的关系,对于其工作原理我们不做详解(Handler机制详解). Messa ...
- Android Handler的简单使用
大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Handl ...
- Android Service使用简单介绍
作为一个android初学者,经常对service的使用感到困惑.今天结合Google API 对Service这四大组件之一,进行简单使用说明. 希望对和我一样的初学者有帮助,如有不对的地方,也希望 ...
- android——handler机制原理
在android版本4.0及之后的版本中多线程有明确的分工,子线程可以写所有耗时的代码(数据库.蓝牙.网络服务),但是绝对不能碰UI,想碰UI跟着主线程走,那么我们如何才能让主线程知道我们要对 UI进 ...
随机推荐
- 禁用窗体关闭按钮(使用GetWindowLong修改GWL_STYLE)
一般我们不想让窗体能够关闭, 首先想到的是在OnCloseQuery事件里设置CanClose := False, 不过在某些情况下这个会和程序关闭窗体的业务逻辑产生冲突 所以写了下面这个函数, 可以 ...
- 组合数学(Pólya计数原理):UvaOJ 10601 Cubes
Cubes You are given 12 rods of equal length. Each of them is colored in certain color. Your task is ...
- 【动态规划】Vijos P1011 清帝之惑之顺治
题目链接: https://vijos.org/p/1011 题目大意: 给一张N*M的地图(N,M<=500),可从任一点开始沿上下左右走,只能走比当前低的地方.问最长能走多少格. 题目思路: ...
- Delphi 为TClientdataset定义结果集,并增加记录
Delphi 为TClientdataset定义结果集,并增加记录 procedure addDefsFieldsForCDS(aDataSet: TClientDataSet);begin aDa ...
- 如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录
最近帮一位上海的朋友搞一块小板,在ubuntu15.04 vivid上已经加载了对应了.ko驱动包 但关键是系统根本就枚举不到该声卡ALC5640,试了OpenSUSE也是一样的结果,看来是内核漏加载 ...
- Eclipse的快捷键及常用设置
本篇文章转自:http://blog.csdn.net/idsunb/article/details/6604451 1.提示键配置一般默认情况下,Eclipse ,MyEclipse 的代码提示功能 ...
- Linux下p2p的聊天功能实现
Linux下p2p的聊天功能实现细节 Do one thing at a time, and do well. 今天闲着没事,写一个P2P的点对点的聊天功能的小程序,我觉得对网络编程初学者的学习很有用 ...
- Codeforces Round #263 (Div. 1) C. Appleman and a Sheet of Paper 树状数组暴力更新
C. Appleman and a Sheet of Paper Appleman has a very big sheet of paper. This sheet has a form of ...
- poj2318 水题(二分+叉积)
题目链接:http://poj.org/problem?id=2318 #include<cstdio> #include<cstring> #include<cmath ...
- 遇到的retain cycle例子
retain cycle 会造成内存溢出,严重情况会引起崩溃.一般注意点也不会发生,但在网络连接比较多的地方就会不小心出现,vc异步的网络请求,成功后的block调用vc,如果此时,用户已经不用此vc ...