Handler的简单使用介绍
Handler在android程序开发中使用的非常频繁、我们知道android是不允许在子线程中更新UI的,这就需要借助Handler来实现,那么你是否想过为什么一定要这个这样子做呢?而且Handler的内部消息处理机制究竟是什么样的呢,我们了解了之后还可以做点什么事?带着这些疑问我系统的学习了一个讲解Handler原理的课程,今天就在这里将自己的学习收获总结下来。毕竟好记性不如烂笔头,想学会跑就必须先学会好好走路。在总结的时候确实很头疼,因为Handler的原理是需要通过源代码才能说的清楚的,而且它处理机制比较复杂,一时不知道该从哪里说起。想来想去,就先从Handler的几个简单的使用方法开始吧,而且在总结过程中为了方便以后快捷的查阅使用,尽量说的精炼,不牵涉到源码的追踪和解析。
一、Handler是什么
Handler是android.os包下的一个消息处理的类。
自己写代码的时候也将经常使用到Handler,但是对于Handler究竟是什么,还真说不出个所以然。Handler到底是什么呢?如下:
Handler是android为我们封装的一套消息处理的机制,也是一套子线程用来更新UI的机制
因此,可以知道,Handler可以做两件事,第一可以在子线程中更新UI,第二可以用来处理消息。下面我们就利用Handler的API,举一个简单的小例子,来看一看Handler是怎么处理消息和更新UI的。
二、Handler使用的l一个小例子以及相应的方法总结
(1)模拟图片轮播效果
大家在点击淘宝的时候肯定遇到过淘宝为你推荐商品的情况,而且推荐的图片会快速的一张接一张的不断的更换。现在我们就用Handeler中的postDelayed方法来简单模拟这样子的一个图片轮播的效果。大家可以翻看源码的注释,这个方法是用来延迟发送一个Runnable实例的,也就是延迟执行该Runnable里的run方法。
首先你要准备三张图片(请读者自行准备),然后新建项目“HandlerTest”,在其activity_main.xml中写入如下代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
> <ImageView
android:id="@+id/imgview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ali"/> </LinearLayout>
代码很简单,就是放置了一个ImageView用来显示图片而已。然后在MainActivity中写入下面的代码:
package com.example.handldertest; import android.os.Bundle;
import android.os.Handler;
import android.widget.ImageView;
import android.app.Activity; public class MainActivity extends Activity { private ImageView img;
//实例化图片数组,存放的是他们的id
private int[] imgs = {R.drawable.ali,R.drawable.girl,R.drawable.q};
private int index = 0; private Handler mHandler = new Handler();
private MyRunnable mr = new MyRunnable(); class MyRunnable implements Runnable{ public void run() {
index++;
index = index%3; img.setImageResource(imgs[index]); mHandler.postDelayed(mr, 1000); } } protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img = (ImageView) findViewById(R.id.imgview); mHandler.postDelayed(mr, 1000);
} }
然后我们是怎么首先图片轮播的呢?其实很简单,我们在主线程中postDelayed一个mr对象,然后再在mr对象的run方法中,然它将自己再postDelayed,这样子它就无限循环下去了。那么run方法也就无限循环了,我们只要在run方法中执行ImageView的图片显示逻辑即可。运行程序,效果如下图:

(2)Handler常用的一个方法小结
相信这些方法大家都不会感到陌生,在Handler的API中都是可以查阅到的。现小结如下:
postDelayed(Runnable r, long delayMillis) 延迟多少秒后直接会执行Runnable里的run方法
sendEmptyMessage(int what) 直接发送一个只包含what字段的消息
sendMessage(Message msg) 发送一个Message对象
removeCallbacks(Runnable r) 从Handler中移除一个Runnable对象
removeMessages(int what) 从Handler中移除一个what字段的消息
上面的方法的使用应该是很熟悉的了,因为经常用到,就不多举例子了,更多的方法可以查找API文档。把重点放在Handler的消息处理机制的总结上。这是下一篇文章所要做的内容。
Handler的简单使用介绍的更多相关文章
- 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍
GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...
- JS图表组件 highcharts 简单的介绍
把highcharts拿来做个简单的介绍,希望更多的朋友可以用到这个用来做图表的js插件. preparation Highcharts Highcharts是一个制作图表的纯Javascript类库 ...
- vue学习笔记(二)——简单的介绍以及安装
学习编程需要的是 API+不断地练习^_^ Vue官网:https://cn.vuejs.org/ 菜鸟教程:http://www.runoob.com/vue2/vue-tutorial.html ...
- EVE-NG简单入门介绍
此篇文章简单的介绍下模拟器EVE-NG的使用,具体包括Dynamips设备导入与运行,IOL设备的导入与运行,QEMU设备的导入与运行,客户端软件的安装,物理网络与虚拟网络的结合等. 一.导入镜像 D ...
- Mybatis缓存(1)--------系统缓存及简单配置介绍
前言 Mybatis的缓存主要有两种: 系统缓存,也就是我们一级缓存与二级缓存: 自定义的缓存,比如Redis.Enhance等,需要额外的单独配置与实现,具体日后主要学习介绍. 在这里主要记录系统缓 ...
- GIT 分布式版本控制系统的简单使用介绍
GIT 分布式版本控制系统的简单使用介绍 1.GIT的概念Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 与 SVN 区别:1. GIT不仅仅是个版本控制系统,它 ...
- android handler机制简单介绍
我们需要了解4个类: handler:处理者,用于发送和接收信息 massage:消息.里面可以存储消息的许多信息 looper:循环泵,用于循环取出消息队列中的消息 MessageQueue(一般不 ...
- GitHub 上排名前 100 的 Android 开源库进行简单的介绍
若有任何疑问可通过邮件或微博联系我 项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开 ...
- NHibernate简单使用介绍
1.在数据库中新建表格,并插入记录,SQL如下: USE WFC_DB GO create table Students ( Id ,) not null, Name ), Age int, Scor ...
随机推荐
- 使用NDK编译含JNI的Android项目常见问题解决方案
有时候,自己下载的或者拷贝过来的JNI项目出现莫名错误,通常是找不到头文件,可能解决方案如下: Removing the C nature: The only way I could find to ...
- Python基础(2) - 动态数据类型
Python是一门强类型语言,单定义变量时不需要制定类型. C#这样定义变量: ; VB这样定义变量: Python不需要制定类型,给变量赋什么类型的值,它就是什么类型.(穿神马就是神马?) > ...
- C#操作Redis SortedSet 有序集合
/// <summary> /// Redis 有序集合 /// </summary> public static void Redis_SetSorted() { Redis ...
- php多进程实现 亲测
php多进程实现 PHP有一组进程控制函数(编译时需要–enable-pcntl与posix扩展),使得php能在nginx系统中实现跟c一样的创建子进程.使用exec函数执行程序.处理信号等功能. ...
- IE9 和IE10 兼容性判断及效果
仅IE9可识别 .d1{ width:100px; height:100px; background:blue; } IE9及一下使用<!--[if IE 8]><![endif]- ...
- IntelliJ IDEA 安装配置
之前一直用的eclipse,以前公司的老大推荐过用这个,但是由于项目都比较赶,没及时学习. 后面这个公司的同时都用的idea,所以就换了 其实并没有那么难主要是刚刚切换时候快捷键不熟悉,打包什么的,有 ...
- Linux_vim文本编辑器指令整理
一般指令模式 : 可以移动光标,可以删除字符和删除整列,可以复制粘贴 编辑模式 : 按下"i, I, o, O, a, A, r, R"任意一个字母时进入;按下ESC退出编辑模式 ...
- JS加法相关
1:首先JS是一种弱语言,但是同类型可以自己相加减 例如“a”+”b” 可以自动组成ab : 1+ 2 自动变成3 var data = 2; var currentPage = data; //2 ...
- 利用setTimeoutc处理javascript ajax请求超时
用过jquery的人都知道里面的$.ajax能设置超时处理及各种错误的抛出,确实好用.原生的js没有对应的方法,还得写各种兼容.在实际运用中,不管请求是否成功都应该做容错处理, 不然用户不知道到底发生 ...
- HTML学习笔记《二》 ----HTML部分标签应用
HTML 部分标签应用 一.HTML中的注释.标签语法以及颜色表示方式 1.HTML中注释: <!-- .... --> 注释的目的:1. 辅助说明 2.代码调试(不同编程语言,注释方式略 ...