Android中的消息机制Handler、Message、Looper之间关系

概念

1. 什么是消息队列(MessageQueue)?
消息队列中存放了大量的消息(Message),采用先进先出的方式来管理Message

2. 什么是消息(Message)?
代表一个行为(what)或者一串动作(Runnable),有两处会用到Message:Handler和Messenger

3. 什么是Handler?
它把消息发送给Looper管理的MessageQueue,并负责处理Looper分给它的消息,主要用来在线程中发消息通知ui线程更新ui。

4. 什么是Looper?
每个线程只有一个Looper,比如UI线程中,系统会默认的初始化一个Looper对象,它负责管理MessageQueue,不断的从MessageQueue中取消息,并将相对应的消息分给Handler处理

5. 线程有没有Looper有什么区别?
线程如果没有Looper,就没有消息队列,就无法处理消息,线程内部就无法使用Handler。这就是为什么在子线程内部创建Handler会报错

6. 为什么要用Handle这样的一个机制?
因为在Android系统中UI操作并不是线程安全的,如果多个线程并发的去操作同一个组件,可能导致线程安全问题。为了解决这一个问题,android制定了一条规则:只允许UI线程来修改UI组件的属性等,也就是说必须单线程模型,这样导致如果在UI界面进行一个耗时叫长的数据更新等就会形成程序假死现象 也就是ANR异常,如果20秒中没有完成程序就会强制关闭。所以比如另一个线程要修改UI组件的时候,就需要借助Handler消息机制了。

7. android中Handle类的主要作用?

  • 在新启动的线程中发送给消息
  • 在主线程获取、处理消息

8. 如何让线程有Looper从而正常使用Handler?步骤:

在线程的run方法中加入如下两句:

  • 调用Looper的prepare()方法为当前线程创建Looper对象,创建Looper对象时,它的构造器会 自动的创建相对应的MessageQueue
  • 创建Handler子类的实例,重写HandleMessage()方法,该方法处理除UI线程以外线程的消息
  • 调用Looper的loop()方法来启动Looper

消息队列和Looper的工作机制

一个Handler会有一个Looper,一个Looper会有一个消息队列,Looper的作用就是循环的遍历消息队列,如果有新消息,就把新消息交给它的目标处理。每当我们用Handler来发送消息,消息就会被放入消息队列中,然后Looper就会取出消息发送给它的目标target。一般情况,一个消息的target是发送这个消息的Handler,这么一来,Looper就会把消息交给Handler处理,这个时候Handler的dispatchMessage方法就会被调用,一般情况最终会调用Handler的handleMessage来处理消息,用handleMessage来处理消息是我们常用的方式。

下面是消息机制中几个重要成员的关系图:

这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值