深入理解Android 消息机制(一)——综述

在日常开发和学习中,我们肯定都会接触到Android消息机制。我们知道,在非UI线程中不能直接更新UI,一般我们都是在非UI线程中通过Handler发送一条消息来更新UI。通过Handler可以将任务切换到Handler所在的线程中。Android消息机制主要是指Handler的运行机制,Handler的运行需要和MessageQueue和Looper配合才能完成。可能有人会问:我在Activity
摘要由CSDN通过智能技术生成

在日常开发和学习中,我们肯定都会接触到Android消息机制。我们知道,在非UI线程中不能直接更新UI,一般我们都是在非UI线程中通过Handler发送一条消息来更新UI。通过Handler可以将任务切换到Handler所在的线程中。Android消息机制主要是指Handler的运行机制,Handler的运行需要和MessageQueue和Looper配合才能完成。可能有人会问:我在Activity新建一个Handler对象,并没有看到MessageQueue和Looper,也照样可以使用Android消息机制啊。其实在启动应用的时候,在主线程中已创建Looper对象,并开始轮询MessageQueue,判断MessageQueue中是否有消息,具体的方式我们后面会讲解。在了解Android消息机制的细节前,我们最好还是先了解Android消息机制的总体框架,心中有个总体框架图,然后再去深入的了解其内部的具体实现。

一,总体框架

上面提到,Android消息机制中有三个角色,分别是:Handler、Looper、MessageQueue(虽然我们叫消息队列,实际上它的实现是链表),其中MessageQueue是存在于Looper中的,而且每个线程只能有一个Loop而对象,但是可以有多个Handler对象,这也是为什么我们可以在主线程创建多个Handler对象。Handler扮演的是消息的传递者以及消息的处理者,Looper负责消息的轮询,MessageQueue负责存储Handler传递过来的消息。以主线程为例,子线程通过主线程中的Handler对象,传递一条消息,这条消息被传递到Looper中的MessageQueue中,然而,Looper中有个方法会一直轮询,判断MessageQueue中有没有消息,当发现有消息的时候,会根据这条消息的target(Handler对象)属性来判断这条消息交给哪个Handler来处理。整个一个流程就是这样的,给出个流程图帮助大家理解:
这里写图片描述

二,分步解析

我们将上面的流程图分成两步:

1,生成一条消息,通过Handler将消息存入Looper中的MessageQueue中。

通常,我们通过Handler创建一条消息并发送的形式是这样的:myHandler.obtainMessage(UPDATE_TEXTVIEW,msg).sendToTarget();这条语句包含两个操作:创建一条消息:发送这条消息,将消息加入MessageQueue中。当然也可以将连个操作分开写,比如写成这样:

Message ms = myHandler.obtainMessage(UPDATE_TEXTVIEW,msg);
ms.sendToTarget();

两种方式看个人习惯,喜欢哪种就写成哪种吧。我们现在通过源码来看下具体的实现是怎样的。首先是Handler的obtainMessage(int what,Object obj)方法,其他的obtainMessage()都差不多,有兴趣的可以去看下,这里我们只看obtainMessage(int what,Object obj)方法。


public final Message obtainMessage(int what, Object obj)
{
    return Message.obtain(this, what, obj);
}

//obtainMessage(int what,Object obj)会调用Message
//的obtain(Handler h, int what, Object obj)方法,我们看
//下obtain()方法的具体实现
public static Message obtain(Handler h, int what, Object obj) {
    Message m = obtain();
    m.target = h;
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值