(八)Android中Handler、Looper、Message、MessageQueue的关系

一、Handler、Looper、Message、MessageQueue类功能简介

1.1 Message

消息类,定义了发送给Handler对象的包含描述和二进制数据对象的消息对象。这个类比较重要的字段:

what:消息码用于接收者识别是啥消息,每个Handler对象有自己的命名空间用于消息码,所以不需要担心不同的Handler对象识别消息码冲突。在消息处理中,我们可以根据这个字段的不同的值进行不同的处理。

arg1/ arg2:用来存放整型值,开销小

obj:任意的Object类型对象传递给接受者。

在使用Message时,我们可以通过new Message()创建一个Message实例;但是Android推荐通过Message.obtain()或Handler.obtainMessage()获取Message对象,这并不一定是直接创建一个新的实例,而是先从消息池(Message内部维护了一个Message池用于Message的复用,避免使用new 重新分配内存)中看有没有可用的Message实例,存在则直接取出并返回这个实例,反之如果消息池中没有可用的Message实例,则根据给定的参数new一个新的Message对象。

1.2 MessageQueue

消息队列,用来存放Message对象的数据结构,按照“先进先出”的原则存放消息。存放并非实际意义的保存,而是将Message对象以链表的方式串联起来的。MessageQueue对象不需要我们自己创建,而是有Looper对象对其进行管理,一个线程最多只可以拥有一个MessageQueue。我们可以通过Looper.myQueue()获取当前线程中的MessageQueue。

1.3 Looper

MessageQueue的管理者,在一个线程中,如果存在Looper对象,则必定存在MessageQueue对象,并且只存在一个Looper对象和一个MessageQueue对象。在Android系统中,除了主线程有默认的Looper对象,其它线程默认是没有Looper对象。如果想让我们新创建的线程拥有Looper对象时,我们首先应调用Looper.prepare()方法,然后再调用Looper.loop()方法。倘若我们的线程中存在Looper对象,则我们可以通过Looper.myLooper()获取,此外我们还可以通过Looper.getMainLooper()获取当前应用系统中主线程的Looper对象。在这个地方有一点需要注意,假如Looper对象位于应用程序主线程中,则Looper.myLooper()和Looper.getMainLooper()获取的是同一个对象。典型的用法如下:

class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
          Looper.prepare();

          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };

          Looper.loop();
      }
  }

1.4 Handler

消息的处理者。Handler对象通过sendMessage(msg)把Message对象添加到MessageQueue中;当looper类的loop()方法循环取到该Message时,就会回调该Message对象对应的handler对象的handleMessage()方法对其进行处理。由于是在handleMessage()方法中处理消息,因此我们应该编写一个类继承自Handler,然后在handleMessage()处理我们需要的操作。

时间: 2024-10-29 20:27:54

(八)Android中Handler、Looper、Message、MessageQueue的关系的相关文章

Handler,Looper,Message,MessageQueue之间关系浅析

一.先看一下使用流程 1.在子线程中使用Handler实例 /***********子线程使用Handler实例*********/ private class LooperThread extends Thread { public Handler handler; @Override public void run() { Looper.prepare(); handler = new Handler() { @Override public void handleMessage(Messa

Android的Handler Looper Message机制应用实例与详解(一)

Android的UI操作不是线程安全的(出于提高性能考虑,避免实现多线程同步等机制所引入的延时),若多个线程同时对UI元素进行操作,可能导致线程安全问题.因此,Android中做了严格的规定:只有UI主线程才能对UI进行设置与操作. 在实际编程中,为了避免UI界面长时间得不到响应而导致的ANR(Application Not Responding)异常,通常将网络访问.复杂运算等一些耗时的操作被放在子线程中执行.这就需要子线程在运行完毕后将结果返回到主线程并通过UI进行显示.在Android中,

Android的Handler Looper Message机制应用实例与详解(二)

上一篇博文给出了Android中基于Handler Looper机制实现线程间通信的两个典型实例.本文将对该机制的基本原理进行较深入的研究.个人认为,学好Android编程最好的老师就是Android的源代码,下面将基于Android-19的源码进行分析,重点阐述分析思路. 要分析Handler Looper机制,自然想到去看Handler类和Looper类的源码(分别位于Handler.java和Looper.java两个文件中).简单阅读两个类的描述后,在Looper类的描述中能找到以下一段

Android消息机制探索(Handler,Looper,Message,MessageQueue)

概览 Android消息机制是Android操作系统中比较重要的一块.具体使用方法在这里不再阐述,可以参考Android的官方开发文档. 消息机制的主要用途有两方面: 1.线程之间的通信.比如在子线程中想更新UI,就通过发送更新消息到UI线程中来实现. 2.任务延迟执行.比如30秒后执行刷新任务等. 消息机制运行的大概示意图如下: 一个线程中只能有一个Looper对象,一个Looper对象中持有一个消息队列,一个消息队列中维护多个消息对象,用一个Looper可以创建多个Handler对象,Han

Handler,Looper,Message,MessageQueue,HandlerThread使用总结(上)

在安卓程序中,经常会有一些耗时的操作例如下载,网络访问等,如果将这些放在主线程执行,会很耗时,这样可能会导致一个异常 叫ANR异常(Application Not Responding)将会阻塞UI线程,从而会导致程序无响应.因此我们会将一些耗时操作放在子线程进行,但是由于android的UI操作并不是线程安全的,因此如果多个线程同时操作UI的话,会导致线程安全问题,因此android制订了一条规则,只允许UI线程(即主线程)进行UI操作,那么我们如何知道子线程何时操作完成呢?例如子线程下载好图

浅析android中handler与Message(一)

hander与message 1.hander 作用:接受子线程的数据,(Message或Runable对象)更新已绑定的对象. 为什么会出现: 在android或其他的应用中存在一些耗时操作,这些操作如果全部出现在主线程中,当他们进行的时候,你是没办法去做其他的事情的.这时人们就想,可不可以在申请一些"资源",专门用来处理这项耗时的操作,而不影响当前的进程. 于是多线程出来了,相应的,就把一些事情放在了另外的一些线程中执行,这时,我们暂且把耗时的认为是子线程(我们自己开启的),把系统

Android异步消息处理 Handler Looper Message关系源码分析

# 标签: 读博客 对于Handler Looper Message 之前一直只是知道理论,知其然不知所以然,看了hongyang大神的源码分析,写个总结帖. 一.概念.. Handler . Looper .Message 这三者都与Android异步消息处理线程相关的概念. 异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,然后回调相应的消息处理函数,执行完成一个消息后则继续循环.若消息队列为空,线程则会阻塞等待. 说了这一堆,那么和Handle

handler looper和messageQueue

一.使用方法. Looper用来处理消息循环,在创建过程中会初始化MessageQueue. Handler在其它线程发消息给当前线程 MessageQueue用来存放消息 Looper对象在哪个线程创建,Handler的handleMessage方法就在哪个线程执行 在创建activity时,android系统本身会为activity创建Looper. final Handler mainHandler = new Handler(getMainLooper()) { @Override pu

深入解析Android中Handler消息机制

Android提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageExchange).Handler消息机制可以说是Android系统中最重要部分之一,所以,本篇博客我们就来深入解析Android中Handler消息机制. Handler的简单使用 为什么系统不允许子线程更新UI 因为的UI控件不是线程安全的. 如果在多线程中并发访问可能会导致UI控件处于不可预期的状态,那为什么不对UI控件的访

异步消息处理机制-Android中Handler原理(续)

异步消息处理线程是指线程启动后会进入一个无限循环,每循环一次,从内部的消息队列里面取出一个消息,并回调相应的消息处理函数.一般在任务常驻,比如用户交互任务的情况下使用异步消息处理线程. 之前在Android中Handler原理里面研究过android里实现异步消息处理线程的方式,基本逻辑如图所示 今天就用java将其简单的模拟出来加深印象,下面的类图是用工具导出的,不太正规,不过能大概看出类之间的关系 Message类:消息类 public class Message { public int