Android学习笔记(38):Handler消息传递处理机制

先说为什么需要Handler:

 

Android的主线程又叫UI线程,用于处理与UI相关的时间。Android只允许在主线程中修改UI组件,当我们在其他线程中需要修改UI界面时,就需要发送消息到主线程,再由主线程来处理UI的修改事件。

 

在UI线程中执行耗时操作或网络操作,否则会抛出ANR (“Application Not Responding”)异常或NetworkOnMainThreadExceptionwill异常。

 

在这些时候,我们用Handler来进行消息的传递和处理。

 

下面来介绍Handler类:

(1)两个主要功能:

1.在非主线程中发送消息。

2.在主线程中获取、处理消息。

 

(2)一起工作的几个组件

Message:Handler接收和处理的消息对象

Looper:每个线程有一个Looper,负责管理MessageQueue。它的loop方法不断从MessageQueue中抽取Message交给Handler处理。

MessageQueue:由Looper负责管理的消息队列,用FIFO的方式管理Message。Looper的构造器中会创建一个MessageQueue对象。

 

(3)Handler用于发送、处理Message的方法:

void handleMessage(Message msg):处理消息的方法,需要自己重写。

boolean hasMessages(int what, Object object):检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息。

boolean hasMessages(int what):检查消息队列中是否包含what属性为指定值的消息。

Message obtainMessage():获取消息。

boolean sendEmptyMessage(int what):发送空消息。

boolean sendEmptyMessageAtTime(int what, long uptimeMillis):在指定的时间发送空消息。

boolean sendEmptyMessageDelayed(int what, long delayMillis):一段时间后发送空消息。

boolean sendMessage(Message msg):发送消息。

boolean sendMessageAtFrontOfQueue(Message msg):消息加入到消息队列的最前面。

boolean sendMessageAtTime(Message msg, long uptimeMillis):在指定时间发送消息。

boolean sendMessageDelayed(Message msg, long delayMillis):一段时间后发送消息。

 

(4)Handler的消息处理机制:

开发者需要重写Handler类的消息处理方法,但新启动的线程发送消息时,消息会发送到与之关联的MessageQueue,Handler不断从MessageQueue中获取并处理消息,在此时调用消息处理方法。

 

(5)利用Handler处理其他线程中需要作出的UI修改:

Android系统在启动的时候会为Activity创建一个消息队列和消息循环(Looper)。为了处理非主线程中的UI处理要求,我们首先在新线程中发送消息,然后在主线程中重写Handler的handleMessage()方法实现UI修改的要求。

时间: 2024-09-11 08:20:04

Android学习笔记(38):Handler消息传递处理机制的相关文章

Android学习笔记45之gson解析json_Android

JSON即JavaScript Object Natation, 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. JSON对象: JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, key-value对之间使用逗号分隔. 如:{"name":"coolxing

Android学习笔记45之gson解析json

JSON即JavaScript Object Natation, 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. JSON对象: JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, key-value对之间使用逗号分隔. 如:{"name":"coolxing

Android学习笔记(二)App工程文件分析_Android

App工程文件分析 关于如何创建一个最简单的Android App请参照链接: < Android学习笔记(一)环境安装及第一个hello world > http://www.jb51.net/article/52593.htm 创建完的工程文件如下图所示,本文对一些主要的文件进行分析. src文件分析 App源文件如图: 打开源文件 MainActivity.java 可看到如下代码: 源码主要功能如下: App源文件目录 package com.example.firstapp; 导入A

Android学习笔记之应用单元测试实例分析_Android

本文实例讲述了Android学习笔记之应用单元测试.分享给大家供大家参考,具体如下: 第一步:在AndroidManifest.xml中加入如下两段代码: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.pccw" android:versionCode="1" android:versionName="1.0&qu

Android学习笔记之应用单元测试实例分析

本文实例讲述了Android学习笔记之应用单元测试.分享给大家供大家参考,具体如下: 第一步:在AndroidManifest.xml中加入如下两段代码: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.pccw" android:versionCode="1" android:versionName="1.0&qu

Android学习笔记(二)

1. Handler的使用        1.Handler类是android.os下的一个类,handler.post(Runnable r)可以将一个线程添加到消息队列中:handler.postDelay(Runnable r, long delayTime)在延迟delayTime毫秒后,将线程添加到消息队列中:handler.removeCalbacks(Runnable r)将队列中挂起的Runnable移出.        2.Handler.obtainMessage()可以获得

Android学习笔记——文件路径、内容Uri学习笔记[转]

一.URI 通用资源标志符(Universal Resource Identifier, 简称"URI"). Uri代表要操作的数据,Android上可用的每种资源 - 图像.视频片段等都可以用Uri来表示. URI一般由三部分组成: 访问资源的命名机制.  存放资源的主机名.  资源自身的名称,由路径表示.  Android的Uri由以下三部分组成: "content://".数据的路径.标示ID(可选) 举些例子,如:  所有联系人的Uri: content:/

Android学习笔记——保存数据到SQL数据库中(Saving Data in SQL Databases)

知识点: 1.使用SQL Helper创建数据库            2.数据的增删查改(PRDU:Put.Read.Delete.Update) 背景知识:                  上篇文章学习了保存文件,今天学习的是保存数据到SQL数据库中.相信大家对数据库都不陌生.对于                             大量重复的,有特定结构的             数据的保存,用 SQL数据库 来保存是最理想不过了.             下面将用一个关于联系人的数

Android开发笔记之:Handler Runnable与Thread的区别详解_Android

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限.下面看例子: 复制代码 代码如下: package org.thread.demo; class MyThread extends Thread{ private String name; public MyThread(St