android基础(六)android的消息处理机制

Android中的消息处理机制由四个部分组成:Message、Handler、MessageQueue和Looper,并且MessageQueue封装在Looper中,我们一般不直接与MQ打交道。

一、Looper

Looper的字面意思是“循环者”,它被设计用来使一个普通线程变成Looper线程。所谓Looper线程就是循环工作的线程。在程序开发中(尤其是GUI开发中),我们经常会需要一个线程不断循环,一旦有新任务则执行,执行完继续等待下一个任务,这就是Looper线程。

一个线程中只有一个Looper对象,一个Looper对象只有一个MessageQueue,而一个线程中可以有多个hander,可以根据需要为hander设置不同的Looper进行处理。

那么如何将一个线程变为Looper线程呢?其实很简单,只需要在该线程中加入以下两行代码:

public class LooperThread extends Thread {
    @Override
    public void run() {
        // 将当前线程初始化为Looper线程
        Looper.prepare();

        // ...其他处理,如实例化handler

        // 开始循环处理消息队列
        Looper.loop();
    }
}

调用Looper.prepare()方法是为了为当前线程的ThreadLocal(关于ThreadLocal的解释详见http://blog.csdn.net/qjyong/article/details/2158097)设值(就我的理解就是创建一个新的Looper给当前线程使用,当一个线程有了Looper对象后该线程就可变为Looper线程了)。然后再调用Looper.loop()方法就让该Looper线程开始工作了,Looper会不断的从自己的MessageQueue中取出队头的消息进行处理。

除了prepare()和loop()Looper类还有其它的一些方法:

Looper.myLooper()   得到当前线程looper对象

getThread()   得到looper对象所属线程

quit()            方法结束looper循环

二、Handler

handler扮演了往MQ上添加消息和处理消息的角色(只处理由自己发出的消息),即通知MQ它要执行一个任务(sendMessage),并在loop到自己的时候执行该任务(handleMessage),整个过程是异步的。handler创建时会关联一个looper,默认的构造方法将关联当前线程的looper,不过这也是可以set的。

有了handler之后,我们就可以使用 post(Runnable)postAtTime(Runnable, long)postDelayed(Runnable, long)sendEmptyMessage(int),

sendMessage(Message)sendMessageAtTime(Message, long)和 sendMessageDelayed(Message, long)这些方法向MQ上发送消息了;使用dispatchMessage(

Message msg)与方法handleMessage(Message msg)。光看这些API你可能会觉得handler能发两种消息,一种是Runnable对象,一种是message对象,这是直观的理解,但其实post发出的Runnable对象最后都被封装成message对象了,一般我们使用Handler的的sendMessage()方法来发送消息到消息队列中,使用handleMessage()方法来处理消息队列中当前handler所发送的消息

Handler的作用:

1.handler可以在任意线程发送消息,这些消息会被添加到该handler关联的MQ上。

2.handler是在它关联的looper线程中处理消息的。

这就是android中为什么不能在其他非主线程中更新UI的问题。android的主线程也是一个looper线程,我们在其中创建的handler默认将关联主线程MQ。因此,利用handler的一个solution就是在activity中创建handler并将其引用传递给worker thread,worker thread执行完任务后使用handler发送消息通知activity更新UI(我的理解就是主线程开启时会自动创建有对应的Handler、Looper和MessageQueue,其所做的操作就是当对界面进行修改时会发送一条消息到消息队列中由Handler取出去进行处理,单当开启子线程后子线程中不会自动创建Handler、Looper和MessageQueue,这样当进行界面匀速修改时是没有消息去通知当前主线程的handler去处理这一动作的,所以要我们自己在子线程中创建一个使用主线程的Looper和MessageQueue的handler发送消息),如下图:

三、Message

在整个消息处理机制中,message又叫task,封装了任务携带的信息和处理该任务的handler。

1.尽管Message有public的默认构造方法,但是你应该通过Message.obtain()来从消息池中获得空消息对象,以节省资源。

2.如果你的message只需要携带简单的int信息,请优先使用Message.arg1和Message.arg2来传递信息,这比用Bundle更省内存

3.擅用message.what来标识信息,以便用不同方式处理message。

时间: 2024-07-29 01:35:28

android基础(六)android的消息处理机制的相关文章

Android基础之Android系统架构

Android采用层次化系统架构,官方公布的标准架构如下图所示.Android由底层往上分为4个主要功能层,分别是linux内核层(Linux Kernel),系统运行时库层(Libraries和Android Runtime),应用程序架构层(Application Framework)和应用程序层(Applications). Linux内核层 Android以Linux操作系统内核为基础,借助Linux内核服务实现硬件设备驱动,进程和内存管理,网络协议栈,电源管理,无线通信等核心功能.An

[Android基础]Android中使用HttpURLConnection

HttpURLConnection继承了URLConnection,因此也能够向指定站点发送GET请求.POST请求.它在URLConnetion的基础上提供了例如以下便捷的方法. int getResponseCode():获取server的响应代码. String getResponseMessage():获取server的訪问信息. String getRequestMethod():获取发送请求的方法. void setRequestMethod(String method):设置发送请

【Android基础】Android SQLite存储自定义对象

Android SQLite存储自定义对象 在SQLite数据库中可存储的数据类型有NULL.INTEGER.REAL(浮点型).TEXT.BOOL,一共是五种数据类型.在Android开发中,我们存储数据的一般的作法是数据库的属性就是类的成员变量,比如: 要存储一个人的姓名和年龄,在类中的是将它们定义为两个成员变量 class Person{ private String name; private int age; } 数据库中是将它们存储为两个字段 - name TEXT - age IN

Android的Looper和Handler消息处理机制详解

Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理. Handler:处理者,负责Message的发送及处理.使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等. MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行.当然,存放Message并非实际意义的保存,而是将Message以链表的方

Android 面试题总结之Android 基础(六)

Android 面试题总结之Android 基础(六) 在上一章节Android 面试题总结之Android 基础ListView(五) 主要是ListView的优化,原理以及一些基本问题. 在阅读过程中有任何问题,请及时联系.如需转载请注明 fuchenxuan de Blog 本章系<Android 之美 从0到1 – 高手之路>Android基础将会总结了Android 布局常见面试问题.其实对于基础方面Android 开发来说,经常面试无非就是UI,网络,数据库,这三大方面,本章节总结

Android消息处理机制:源码剖析Handler、Looper,并实现图片异步加载

引言 我们在做 Android 开发时,常常需要实现异步加载图片/网页/其他.事实上,要实现异步加载,就需要实现线程间通信,而在 Android 中结合使用 Handler.Looper.Message 能够让不同的线程通信,完成异步任务.虽然 Android 官方为我们提供了 AsyncTask 类来完成异步任务,但这个类存在许多问题,并不好用,而且,AsyncTask 也是通过 Handler 和 Thread 来实现异步加载的,所以学习这方面的知识是有必要的 本文讲解思路大致如下:绘制 A

7.1 基础知识Android消息处理机制

1. Android消息处理机制: Handler, MessageQueue, Looper, Thread 线程概念 : 一个应用程序运行时它的主体被称为进程, 一个进程内部可以有多个线程, 线程共享进程的资源 线程间通信 在android系统中是怎么封装通讯的,假如存在两个线程A和B,如果A线程要告诉B线程一些消息,怎么实现? A进程怎么发发消息?(1)构造消息,消息里面有数据信息和处理函数(2)发消息:这两个步骤在android源码中被封装成Handler 消息在android中被封装为

第3课第1节_基础知识Android消息处理机制

E:\Github\hello-world\APP_Addons_0001_Message\app\src\main\java\com\thisway\app_addons_0001_message\MainActivity.java package com.thisway.app_addons_0001_message; import android.os.Handler; import android.os.Looper; import android.os.Message; import

用.Net打造一个移动客户端(Android/IOS)的服务端框架NHM——Android端消息处理机制

NhmFramework Android端的消息处理机制原理 1.概要表述:在我们的框架中,Android客户端通过继承Application来控制整个应用程序的生命周期,在Application onCreate()方法中,我们将启动一个MainService,这个Service将负责Activity的异步消息处理(包括异步Http请求).任务调度.数据共享等大部分持久化操作.那么这样做的目的何在呢? 1)异步消息处理:在Service中实现异步消息处理是为了将Activity的界面显示的操作