简单理解Android消息机制

关于安卓的消息处理机制问题,网上说了比较多,很多都抛上源代码去解析,但我其实很不喜欢去一个个研究源代码,虽然现实就是要去看源代码比较好,本篇博客主要用一个简单的例子来讲讲怎么处理。

抽奖问题:按下抽奖按钮,抽奖数字从1开始快速滚动到60,不断循环…

如果我们初学Android不知道消息处理,那么我们会是这样的思路去做:让一个变量从1到60不断在线程中循环,在UI上设置显示的数字就是不断循环的那个变量。

现象:只会显示一次数字,并且显示之后闪退。(不正确)
原因:Android规定只能在主线程进行UI操作,而我们自己创建的子线程是不可以改变UI界面的。

试想一下,如果子线程都可以改变UI界面,那么若是众多子线程一起操作,就是不断在访问主线程的变量,这就会造成线程安全问题,所以Android的消息处理机制应运而生

解决:我们使用 Handler。

**详解:**Android的消息机制其实主要是指Handler的运行机制,Handler又需要MessageQueue和Looper的参与。通俗来说:当界面需要进行交互的时候,子线程只需要把消息发送到主线程里,主线程会先把消息存储到消息队列,同时主线程的Looper通过不断地对MessageQueue进行轮询,如果有消息那就交给对应的handler的子线程去处理,如果没有消息的话,主线程就会先阻塞着,等待处理消息。

  1. MessageQueue:消息队列,其实叫它队列只是源于它工作的方式和队列比较像,是先进先出,谁的消息先到,就处理谁的,而消息真正的存储方式应该是单链表,插入和删除元素方便,都是o(1)。enqueueMessage,removeMessages,removeCallbacksAndMessages,next等方法可以参见MessageQueue类。
  2. Looper:完成MessageQueue与Handler进行交互的功能,/通常运行在一个消息的循环队列当中,线程在默认的情况下,不会给我们提供一个消息循环去管理消息队列的。如果想管理消息队列,需要在线程当中调用Looper.prepare()方法使消息循环初始化,并且调用Looper.loop()使消息循环一直处于运行状态,直到停止循环。// 但是,主线程中,无需使用显式的方式进行Looper的初始化以及开始循环,Activity内部包含一个Looper对象,它会自动管理Looper,处理子线程中发送过来的消息。而初始化Handler的时候,在Handler的构造函数中,会把当前线程的Looper与Handler关联,所以在Activity中,无需显式使用Looper。
  3. Handler:主要是收发消息,我们需要创建Handler子类对象,并重写handleMesaage方法。

最近才接触这个,目前理解到这的就是这些啦!

猜你喜欢

转载自blog.csdn.net/chan_fan/article/details/86631995
今日推荐