Android核心框架之消息传递机制介绍: Looper、MessageQueue、Message、Handler的关系

Looper、MessageQueue和Hanlder是Android系统的核心之一,系统四大组件在Client端和Server端进行交互依赖于此。所以了解这几个系统类之间的关系,非常重要。下面就分别介绍这三个模块:

1.Looper:

    Looper用来处理线程的消息循环,默认线程是没有消息循环队列的,需要执行prepare或者prepareMainLooper方法创建Looper对象,调用loop开启消息循环。这里写图片描述
    获取线程(或者主进程)的Looper,使用myLooper()方法获取,最终通过sThreadLocal.get()方法获取,ThreadLocal给每个子线程存储一个备份,所以一个子线程(或者主线程)只有一个Looper。

2.MessageQueue

    MessageQueue包含了需要Looper处理的Message,MessageQueue不能直接添加Message而是通过Handler。
    MessageQueue是由Looper初始化的时候创建的:
这里写图片描述

3.Handler

    Handler是用来向MessageQueue传入Message信息,异步处理Message信息。
Handler有两种执行方式:
3.1 可以执行post方法(post方法本质是在方法内部重新封装了Message,回调方法是callback方法,见下图)
这里写图片描述
getPostMessage封装了Message方法
3.2 sendMessage(回调方法是handleMessage方法,这个是需要开发者重写的)方法向MessageQueue中加入Message信息。
这里写图片描述
Handler一般处理Message都是异步的,但是有一个例外执行runWithScissors方法。
创建Handler时一般需要指定需要Handler需要处理Looper(间接指定了Message加入
的MessageQueue、Message处理的线程)。
如果没有指定,默认使用Handler所处线程或者主线程的Looper。

4.Android开发中需要注意的事项

1)在子线程中启动Toast会弹框报错Can’t toast on a thread that has not called Looper.prepare()。Toast的显示因为Toast的显示是通过Handler来实现的,子线程不指定Looper会导致Crash。
2)Android封装类HandlerThread:HandlerThread类继承Thread,该类自建了Looper。
3)Android封装类Messenger:系统可以使用Messager进行进程间通信。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值