Android异步消息处理机制

1、异步消息处理机制

学习Android异步消息机制之前,我们需要搞懂这么几个问题:

·什么是异步消息处理

·为什么需要异步消息处理

·怎么实现异步消息处理


什么是异步消息处理:

所谓的异步机制,是指在进行消息处理时,不必等到消息处理完毕才返回。所以异步也就等同于非阻塞
通俗的来讲就是异步不用等待代码执行的结果,而去执行后续的代码。在弄清楚什么是异步之后,我们就需要了解一下什么是异步消息处理线程。回顾Java中线程的概念,一般的线程在执行完run方法后,线程也就随之结束。而异步消息处理线程则是一个内部无限循环的线程,每循环一次就从消息队列中取出一个消息进行处理,然后再取出下一个消息进行处理。这样就形成了一个异步机制。当其他线程想当前线程向当前线程发送消息时,只需要将当前消息发送到消息队列中,便可以执行其他操作,而当前线程就会在不定的时间从消息队列中取出消息进行处理。


为什么需要异步消息?

在Android开发中:

·为了保证Android的UI操作是线程安全的,Android中规定了只允许UI线程修改Activity中的UI组件;

·为了避免过多操作发生的同一线程中导致的阻塞问题

·在实际开发中,有不可避免的会用到多个线程并发操作UI组件,这又导致了UI操作是线程不安全的

所以最后要解决的问题是:

·保证线程安全;

·使多个线程并发操作UI组件


怎么实现异步消息处理?


在了解了异步消息的基础之后,我们可以得到实现异步消息的思路:

·每个异步线程中拥有一个消息队列,用先进先出的方式管理。外不线程可以向该消息队列添加消息

·每个异步消息的内部都会有一个while(true)的结构,进行无限循环,一旦消息队列中有消息,就取出相应的消息进行处理,并回调相应的方法。


在正式学习Android异步消息机制之前,还需要了解相关的概念:

主线程(UI线程):

·定义:当程序第一次启动时,Android会同时开启一条主线程(Main Thread)

·作用:主线程主要负责处理与UI相关的事件,所以主线程又叫UI线程

子线程负责一些比较耗时操作(联网、取数据、SD卡数据加载等操作),而主线程和子线程之间的通信就依赖于Handler了。


Message:

·定义:消息,理解为线程间通讯的数据单元(Handler接受和处理的消息对象,也就是基本的数据单元)

例如后台线程在处理完数据之后,需要更新UI,则需要发送一条包含更新信息的Message给UI线程

MessageQueue:

·定义:消息队列

·作用:负责存放通过Handler发送过来的消息,也是一个按照Message执行时间先后排序的优先级队列

Handler:

·定义:handler是Message的主要处理者

·作用:负责将Message添加到消息队列中,并且处理Looper分配过来的Message

Looper:

·定义:循环器,MessageQueue于Handler之间的桥梁

·作用:主要负责消息循环,循环取出MessageQueue的Message;消息派发:将取出的Message交给相应的Handler

1、每个线程中,只能拥有一个Looper,但是一个Looper只能与多个线程的Handler绑定起来,也就是说很多歌线程可以往一个Looper所持有的MessageQueue中,发送消息。这就给我们提供了实现线程间通信的可能
2、Handler在创建的时候,可以显示指定Looper。这样在Handler在调用sendMessage()投递消息的时候,会将消息添加到指定的Looper中的MessageQueue。如果不指定Looper,Handler默认绑定的是创建它的线程拥有的Looper



Android主线程异步消息处理的实现:
在Java中,一个程序的入口是main方法,而我们在开发应用程序的过程中,并没有遇到过main方法,甚至有不少人认为程序的入口是onCreate()方法式应用程序的起点。其实不然,首先Android开发采用的是Java语法,并且程序的运行环境Dalvik是在JVM基础之上开发而来的,所以程序最后仍然是将main方法作为程序的入口。只不过Android的底层为我们完成了相应的封装,而它就是位于ActivityThread类中,因此ActivityThread也就是我们常说的主线程(也叫UIThread)。
public static void main(String args[]) {
    
    //  1、创建消息机制Loop,同时也会创建消息队列
    Looper.preparedMainLoop();

    if(sMainThreadHandler == null) {  //  2、获得Handler对象
        sMainThreadHandler = thread.getHandler();
    }
     //  3、进入消息循环
    Looper.loop();
}


  
  

在main方法中,并没有找到while(true)的结构,难道Android中的主线程不是异步消息处理?其实在Android中是通过Looper、Handler、Message、MessageQueue来实现异步消息的,,也正是在这样的机制中,各个类负责不同分工从而实现了异步消息处理。


在下一篇博客中,在详细介绍Looper、Message、MessageQueue、以及Handler工作流程以及异步消息机制的应用场景。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值