Android中的消息队列 (转发)

自己新浪博客转移

我们要理解Android 的消息系统,Looper,Handle,View 等概念还是需要从消息系统的基
本原理及其构造这个源头开始。从这个源头,我们才能很清楚的看到Android 设计者设计消息
系统之意图及其设计的技术路线。

1.消息系统的基本原理

从一般的系统设计来讲,一个消息循环系统的建立需要有以下几个要素:

 消息队列
 发送消息
 消息读取
 消息分发
 消息循环线程

首先来研究一下消息驱动的基本模型,我使用如下的图形来表示一个消息系统最基本构成:

android中的消息队列

  上面的模型代表应用程序一直查询自己的消息队列,如果有有消息进来,应用消息处理函数中
根据消息类型及其参数来作相应的处理。

 消息系统要运作起来,必定有消息的产生和消费。我们可以从下图看到消息生产和消费的一
个基本的链条,这是一个最基本的,最简单的消息系统。

android中的消息队列
 

   生产线程将消息发送到消息队列,消息消费者线程从消息队列取出消息进行相应的处理。
但是这样简单的模型对实际运行的系统来说是不够的,例如对系统资源的消耗等不能很好的处
理,我们就需要一个有旗语的消息系统模型,在上面的消息系统模型中加入了一个旗语,让消
息消费者线程在没有消息队列为空时,等待旗语,进入到挂起状态,而有消息到达时,才被唤
醒继续运行。当然生产者同时也可以是消费者。
android中的消息队列

2.Android 的消息模型
    Android 要建立一个消息系统使用了Looper,MessageQueue,Handler 等概念,从上节的原
理我们可以知道这些都是概念包装,本质的东西就是消息队列中消息的分发路径的和消息分发
处理方式的设计。Android 巧妙的利用了对象抽象技术抽象出了Looper 和Handler 的概念。在
Looper 和Handler 两个概念的基础上,通过View 的处理函数框架,Android 十分完美的达到消
息分发的目的。

参照基本消息系统描述模型,我给出了Android 消息系统整体框架,表示如下:

android中的消息队列
 

Android 消息系统消息分发框架

android中的消息队列

android中的消息队列

Handler 属于某个线程,取决Handlerd 对象在哪个线程中建立。Handler 在构建时做了如下的默
认动作:

 从线程上下文取得Looper。
 通过Looper 获取到消息队列并记录在自己的成员mQueue 变量中

Handler 使用消息队列进行对象封装,提供如下的成员函数:

 通过post(Runnable r)发送。Runnable 是消息处理的回调函数,通过该消息的发送,引起
    Runable 的回调运行,Post消息放置消息队列的前面。Message.callback=Runable.
 通过sendMessage 发送。放置在所有的Post 消息之后,sendMessage 发送消息.
 dispatchMessage 分发消息。消息带有回调函数,则执行消息回调函数,如何没有则使用默
   认处理函数:handleMessage 。而handleMessage 往往被重载成某个继承Handler 对象的新
    的特定的handleMessage 。

几乎所有的Message 发送时,都指定了target。Message.target=(this).

Looper 运行在Activity 何处?我们现在可以从代码堆栈中纵观一下Looper 的位置。

NaiveStart.main()

ZygoteInit.main

ZygoteInit$MethodAndArgsCall.run

Method.Invoke

method.invokeNative

ActivityThread.main()

Looper.loop()

ViewRoot$RootHandler().dispatch()

handleMessage

....

这样我们就更清楚的了解到Looper 的运行位置。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值