android聊天程序实现原理,Android消息机制(上层实现)

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

Handler使用场景

将一个任务切换到Handler所在的线程去执行:

通常用作子线程更新UI、HandlerThread、IntentService

Android的UI不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态,如果对UI控件的访问加上锁机制的话,有两个缺点:首先加上锁机制会让UI访问的逻辑变得复杂;其次锁机制会降低UI访问的效率,因为锁机制会阻塞某些线程的执行。基于这两个缺点,最简单且高效的方法就是采用单线程模型来处理UI操作,对于开发者来说也不是很麻烦,只是需要通过Handler切换一下UI访问的执行线程即可。

Handler使用流程

假设mainThread和workThread两个线程,现在要从workThread切换到mainThread中执行某个操作。确定任务需要在哪个线程中执行,则在这个线程中初始化Looper(线程和Looper的对应关系由ThreadLocal维护)。

要做的是,在mainThread中创建Looper:1Looper.prepare()

在mainThread创建Handler。要做的是:1Handler handler = new Handler()

启动消息循环:1Looper.loop()

在workThread线程中获取mainThread的Handler,并且发送消息:1

2

3

4handler.sendMessage...// 最终调用会调用sendMessageAtTime(msg,time)

handler.post...// post..最终调用也会调用sendMessageAtTime(msg,time)

//sendMessageAtTime..方法最终调用enqueueMessage(..)方法,其内部会指定msg.target = this,this就是指当前的handler,处理消息时用得到!!

轮询MessageQueue(这一步不需要我们写代码,是为了流程的完整性,将其列出):1

2loop()方法中执行:Message msg = queue.next(),

接着:msg.target.dispatchMessage(msg) //将消息发送给对应的Handler(msg.target就对应的Handler)

这时,就可以在mainThread中执行workThread发送过来的消息了,handler处理消息的方式有三种:1

2

3handler.post(...) //第一优先级:执行post所传递的Runnable参数.run()

new Handler(callback) //第二优先级:执行构造方法传来的callback匿名内部类handleMessage(msg)

handlerMessage(msg)//第三优先级:调用Handler的handlerMessage()方法

以上,只有第4步是写在workThread中的,其余代码都是在mainThread里的。handler.post()什么作用???补充:

Android中的UI线程是不需要创建Looper的,因为ActivityThread被创建的时候就会初始化Looper。

tu

Handler工作流程及原理

Handler的部分工作原理流程在上一节已经有所提到,而这部分主要从源代码的角度分析下Handler的原理及工作流程。

Handler知识点Handler与线程的关系

一个线程可以有多个Handler

Handler与Looper的关系

Looper与线程的关系

Looper与MessageQueue的关系

MessageQueue与线程的关系

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值