Android开发之Handler

Handler 定义与作用

主要接受子线程发送的数据, 并用此数据配合主线程更新UI。

解释:当应用程序启动时,Android 首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行事件分发,比如说,你要是点击一个 Button,Android 会分发事件到 Button 上,来响应你的操作。如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,如果这些操作放在主线程中,界面会出现假死现象,如果5秒钟还没有完成的话,会收到 Android 系统的一个错误提示 "强制关闭"。这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android 主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。Handler 就用来解决这个复杂的问题 ,由于 Handler 运行在主线程中(UI线程中), 它与子线程可以通过 Message 对象来传递数据,这个时候 Handler 就承担着接受子线程传递的 Message 或者 Runnable 对象 (里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。

Handler 的特点

Handler 可以分发 Message 对象和 Runnable 对象到主线程中, 每个 Handler 实例,都会绑定到创建他的线程中(一般是位于主线程),它有两个作用:

1. 安排 Message 或 Runnable 在某个主线程中某个地方执行;

2. 安排一个动作在不同的线程中执行。

Handler 中分发消息的一些方法

post(Runnable)postAtTime(Runnable,long)postDelayed(Runnable long)sendEmptyMessage(int)sendMessage(Message)sendMessageAtTime(Message,long)sendMessageDelayed(Message,long)

以上 post 类方法允许你排列一个 Runnable 对象到主线程队列中,sendMessage 类方法,允许你安排一个带数据的 Message 对象到队列中,等待更新。

Handler 应用实例

子类需要继承 Handler 类,并重写 handleMessage(Message msg) 方法,用于接受线程数据。

以下为一个实例,它实现的功能为:通过线程修改界面Button的内容

public class MyHandlerActivity extends Activity { Button button; MyHandler myHandler; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.handlertest); button = (Button)findViewById(R.id.button); myHandler = new MyHandler();// 当创建一个新的 Handler 实例时,它会绑定到当前线程和消息的队列中,开始分发数据 // Handler 有两个作用:// 1. 定时执行 Message 和 Runnalbe 对象 // 2. 让一个动作,在不同的线程中执行 // 安排消息,用以下方法 // post(Runnable) // postAtTime(Runnable, long) // postDelayed(Runnable, long) // sendEmptyMessage(int) // sendMessage(Message) // sendMessageAtTime(Message, long) // sendMessageDelayed(Message, long) // 以上方法以 post 开头的允许你处理Runnable对象 // sendMessage() 允许你处理 Message 对象(Message 里可以包含数据) MyThread m = new MyThread(); new Thread(m).start(); } /** * 接受消息,处理消息,此 Handler 会与当前主线程一块运行 **/ class MyHandler extends Handler { public MyHandler() { } public MyHandler(Looper L) { super(L); } // 子类必须重写此方法,接受数据 @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub Log.d("MyHandler", "handleMessage"); super.handleMessage(msg); // 此处可以更新UI Bundle b = msg.getData(); String color = b.getString("color"); MyHandlerActivity.this.button.append(color); } } class MyThread implements Runnable { public void run() { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Message msg = new Message(); 		// 存放数据 Bundle b = new Bundle(); b.putString("color", "我的");msg.setData(b);// 向Handler发送消息,更新UI MyHandlerActivity.this.myHandler.sendMessage(msg); } } 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android日志Log使用

Android开发中日志工具的使用是十分重要的,可以帮助我们定位和查找程序执行的问题,了解程序执行过程等。这里以 Eclipse 下的的安卓开发为例进行说明。 打开 LogCat 功能 首先,确保 Eclipse 软件中已经打开了日志工具 LogCat 功能&#xff…

Android项目目录结构

在 Eclipse 中新建或者打开一个 Android 项目,可以看到目录视图如下所示: 其实项目开发中,使用频率较高的并不多,我们只要了解清楚不同类型的文件和不同目录的对应关系就可以了。 1. src src 目录用于存放 Java 代码&#xff0…

Libusb开发教程二 API介绍与使用

背景介绍 上一篇博文主要介绍了 Libusb 在 Linux 系统下的详细安装过程,除了 libusb-1.0.9.tar.bz2 离线包之外,还安装了 libusb-compat-0.1.4.tar.bz2。顾名思义,第二个是先前版本的兼容包,因此在使用过程中,开发者就…

tty,串口,控制台与驱动程序

tty 设备的名称是从过去的电传打字机缩写而来,最初是指链接到 Unix 系统上的物理或者虚拟终端。随着时间的推移,当通过串行口能够建立起终端连接后,这个名字也用来指任何的串口设备。物理 tty 设备的例子有串口、USB 到串口的转换器&#xff…

Linux 串口编程一 一些背景

在大部分讲解 Linux 编程书籍的时候会发现没有单独的串口编程章节,实际上串口编程已经被概括在了“终端”或者“终端IO”章节里面。在上一篇博客中对经常出现的几个容易混淆的概念进行简单描述:tty,串口,控制台与驱动程序。后面会…

Linux 终端概述与分类

该博文已经迁移到其他博客,参见: Linux 终端IO概念与背景介绍

Linux tty驱动程序一 架构

tty 核心概览如下图所示: 可以看到,tty 架构的划分层次,由下至上的逻辑关系为:硬件 -> tty 驱动 -> tty 线路规程(也译为行规程)-> tty 核心 -> 用户层。 内核负责控制 tty 设备的数据流&…

Linux 串口编程二 深入了解 termios

前言 这一系列串口编程重点在应用层编程,但是在讲解原理与相关概念时需要对驱动框架有个基础的认识。如果只是浅尝辄止,以后在遇到串口驱动与应用层程序调试难免遇到瓶颈。关于 tty驱动架构参见我的其他博客:Linux tty驱动程序架构。有时了解…

Libusb开发教程三 USB设备程序开发

首先,需要指出本篇博客的基础仍然是基于 libusb V1.0 以下。主要考虑到保持与之前博客的连贯性,在上一篇博客中介绍了老版本中可以被调用的 API 以及功能介绍,对于库中 API 接口函数的使用相信读者会一目了然,不需要刻意记忆&…

Linux 串口编程三 使用termios与API进行串口程序开发

在 termios 结构体以及内部终端控制标志中,并非所有的参数对于实际的物理串口都是有效的,在使用过程中也不需要对于所有标志的作用都有所理解。事实上,快速掌握一项技术的核心点也是一种学习能力。对于使用,熟悉并掌握操作框架十分…

Linux 串口编程四 串口设备程序开发

Linux 串口编程和程序相对来说是很简单的,之所以用博客连载来展示,主要是想在学会使用的基础上掌握相关背景,原理以及注意事项。相信在遇到问题的时候,我们就不会对于技术的概念和 API 的使用浅尝辄止了。下面进入具体应用案例&am…

POSIX 串口编程指南

介绍 POSIX 串口编程指南将教会你在你的 UNIX 工作站或者 PC 上面如何成功、有效以及可移植性的对串口编程。每一章提供了使用 POSIX 终端控制函数的编程例程,可以基本不经修改地工作在 IRIX, HP-UX, SunOS, Solaris, Digital UNIX, Linux 以及其他大多数 UNIX 操作…

串口流控

流控作用 这里讲到的“流”,指的是数据流。数据在两个串口之间传输时,当通讯双方速率不匹配时,常常会出现丢失数据的现象。如台式机与单片机之间的通讯,若接收端数据缓冲区已满,继续发送来的数据就会丢失。在早期网络…

电容的分类及作用

旁路 旁路电容是为本地器件提供能量的储能器件,它能使稳压器的输出均匀化,降低负载需求。就像小型可充电电池一样,旁路电容能够被充电,并向器件进行放电。为尽量减少阻抗,旁路电容要尽量靠近负载器件的供电电源管脚和…

快速解决 Android SDK Manager 无法下载或者下载速度慢

在这里以 Windows 下的 Android SDK Manager 为例,其他系统下与此类似,只会存在部分工具栏名称不同的情况,不明之处可以追问。下面就进入具体配置流程: 1. 选择 Tools->Options 进入代理设置。 代理设置选项,在 H…

安卓之USB主机(Host)与配件(Accessory)模式

安卓设备与USB硬件通讯时有两种模式可以选择:USB Host 模式与 USB Accessory 模式。从 USB 逻辑角色来说,USB Host 模式是指安卓设备作为 USB 主机,所有活动均由安卓设备发起;USB Accessory 模式是指安卓设备作为 USB 设备&#x…

安卓USB开发教程 一 USB Host 与 Accessory

安卓通过两种模式:USB Accessory 与 USB Host 模式支持多种 USB 外设与安卓 USB 配件(实现安卓配件协议的硬件)。在 USB 配件模式下,外部 USB 硬件充当 USB 主机。配件实例可能包含机器人控制器、扩展坞、诊断和音乐设备、售货亭、…

安卓USB开发教程 二 USB Host

USB Host(主机模式) 当 Android 设备处于 USB 主机模式时,它充当 USB 主机,为总线供电,并枚举连接的 USB 设备。Android 3.1 及更高版本支持 USB 主机模式。 API 概述 在开始之前,理解需要使用的类是很重…

安卓USB开发教程 三 USB Accessory

USB Accessory(配件模式) USB 配件模式允许用户连接专为 Android 设备设计的 USB 主机硬件。配件必须遵守 Android Accessory Development Kit 文档中列出的 Android 配件协议。 这使得 Android 设备无法充当 USB 主机时仍然可以与 USB 硬件交互。 当 A…

Android ADB

Android 调试桥 本文内容 adb 的工作方式在您的设备上启用 adb 调试通过 WLAN 连接到设备查询设备将命令发送至特定设备安装应用设置端口转发将文件复制到设备/从设备复制文件停止 adb 服务器adb 命令参考发出 shell 命令 调用 Activity Manager (am)调用软件包管理器 (pm)进行…