Android——Handler
Handler——是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,可以发送也可以处理消息
主要作用:1)在新启动的线程中发送消息;2)在主线程中获取、处理消息。
(想想银行取钱若多线程则有可能变成负数,就知道为啥要引入这种机制了。主线程通常又被称作UI线程)
Handler、Looper和MessageQueue的工作原理
Message:Handler接收和处理的消息对象
Looper:每个线程只能拥有一个Looper,它的loop方法负责读取MessageQueue中的消息,读到信息之后就把消息交给发送该消息的Handler进行处理。
MessageQueue:消息队列,采用先进先出的方式来管理Message。程序在初始化Looper时会创建一个与之关联的MessageQueue。
简而言之就是:handler负责发送消息,Looper负责接收Handler发送的消息,并直接把消息回传给handler自己(所以说,如果希望Handler正常工作,必须在当前线程中有一个Looper对象。在主UI线程中,已经初始化了,可直接创建Handler即可,但是在子线程中,必须自己创建一个Looper对象,并启动它。),MessageQueue就是一个存储消息的容器。
prepare()方法保证每个线程最多只有一个Looper对象,然后调用Looper的静态loop()方法来启动它,该方法使用一个死循环不断取出MessageQueue中的消息。
Handler这个特殊类可以说是Runnable和Activity交互的桥梁
在线程中使用Handler的步骤如下:
1)调用Looper的prepare()方法为当前的线程创建Looper对象,创建Looper对象时,它的构造器会创建与之配套的MessagQueue。
2)有了Looper之后,创建Handler子类实例,重写HandlerMessage()方法,该方法负责处理来自于其他线程的消息。
3)调用Looper的loop()方法启动Looper。
以在新线程中计算质数为例解释上述过程。(之所以利用新线程是因为若在UI线程中执行一个耗时操作容易导致UI线程被阻塞。)
为了将用户在UI界面输入的数值动态传给新线程,所以创建了一个Handler对象,然后UI线程的事件处理方法可以通过该Handler向新线程发送消息了。关键代码如下:
//定义一个线程类 class CalThread extends Thread{ public Handler mHandler; @Override public void run() { Looper.prepare(); mHandler = new Handler(){ //处理消息的方法 @Override public void handleMessage(Message msg) { System.out.print("统计质数的方法省略"); } }; Looper.loop(); } }
备注:在新线程内创建了一个Handler,由于在新线程中创建Handler时必须先创建Looper,因此程序先调用Looper的prepare()方法为当前线程创建了一个Looper实例,并创建配套的MessageQueue,新线程有了Looper对象之后,接下来程序创建了一个Handler对象,该Handler可以处理其他线程发送过来的消息。程序最后还调用了Looper的loop()方法。运行时,计算质数会交给新线程执行。
Android——Handler的更多相关文章
- Android Handler leak 分析及解决办法
In Android, Handler classes should be static or leaks might occur, Messages enqueued on the applicat ...
- Android Handler练习
package com.example.myact12; import java.util.Random; import android.support.v7.app.ActionBarActivit ...
- Android Handler简单使用
package com.example.myhandlertest3; import android.os.Bundle; import android.os.Handler; import andr ...
- Android Handler的使用
大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Handl ...
- [Android]Handler的消息机制
最经面试中,技术面试中有一个是Handler的消息机制,细细想想,我经常用到的Handler无非是在主线程(或者说Activity)新建一个Handler对象,另外一个Thread是异步加载数据,同时 ...
- 详解Android Handler的使用-别说你不懂handler
我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念 Handler主 ...
- Android handler Thread 修改UI Demo
/********************************************************************** * Android handler Thread 修改U ...
- Android Handler的简单使用
大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Handl ...
- 详解Android Handler的使用
我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念 Handler主 ...
- 详解Android Handler的使用-别说你不懂handler(转)
我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念 Handler主 ...
随机推荐
- Mybatis的choose when otherwise
<select id="getCount" resultType="int"> select count(1) from <choose> ...
- CuPlayer
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...
- Reactjs-JQuery-Vuejs-Extjs-Angularjs对比
写在前面 前端越来越混乱了,当然也可以美其名曰:繁荣. 当新启动一个前端项目,第一件事就是纠结:使用什么框架,重造什么轮子? 那么,希望看完此篇,能够给你一个清晰的认识,或者让你更加地纠结和无所适从 ...
- Android View的绘制流程
写得太好了,本来还想自己写的,奈何肚里墨水有限,直接转吧.正所谓前人种树,后人乘凉.. View的绘制和事件处理是两个重要的主题,上一篇<图解 Android事件分发机制>已经把事件的分发 ...
- 事件分发时候的onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent调用顺序
一直想弄清楚onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent的执行顺序,以及内部使用switch (event.getAction())中的执 ...
- ASP.NET压缩输出的HTML内容
在ASP.NET中,怎么压缩输出的HTML内容,怎么替换HTML中的换行符,空白,TAB等符号呢? 1.新建一个基类,继承自System.Web.UI.Page,代码如下: using System. ...
- yii2组件之多图上传插件FileInput的详细使用
作者:白狼 出处:http://www.manks.top/yii2_multiply_images.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连 ...
- 传统IT企业与互联网企业的一点思考
[注意前提]应当说,比较常用的管理策略并没有界线分明的优劣之分,只有适不适合企业的经营战略,团队文化,发展状况等. 之所以有传统IT企业与互联网企业的区别,主要的原因是两者所处的市场环境与经营思路造成 ...
- JQuery 了解
jQuery是什么?为什么是这样?怎么用? jQuery是对JavaScript的一种封装,是一个常用功能库.javascript是做什么的jquery就是做啥的.用它主要使写js更简便而强大,有些功 ...
- Java导出excel
一.介绍 常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际的开发中,很多时候需要实现导入.导出Excel的应用. ...