文档章节

Handler机制

墨梅
 墨梅
发布于 2014/04/27 09:29
字数 1128
阅读 55
收藏 0

一、Handler的定义:

   Handler主要用于接收子线程发送过来的数据, 并用此数据配合主线程进行UI的更新。

   当应用程序启动时,Android首先会开启一个主线程 (UI线程),主线程主要为管理界面中的UI控件,进行事件的分发,好比如,你要点击一个 Button控件,Android就会通过此Buttond的监听器分发事件到此Button上,以此来响应你的操作。如果此时是一个需要耗时长的操作,例如:联网读取数据,或者读取本地较大的一个文件的时候,就不能把这些操作放在主线程当中了,如果被放在主线程中的话,界面会出现假死现象,如果5秒钟还没有完成的话,会收到Android系统的一个错误提示“强制关闭”。这个时候就需要把这些耗时的操作,放在一个子线程当中了,因为子线程可能会涉及到UI的更新,当新线程中有涉及到操作UI的操作时,就会对主线程产生危险,因此,Android提供了Handler作为主线程和子线程的纽带。也就是说,更新UI只能在主线程当中进行更新,在子线程中操作是危险的。

   由于Handler是运行在主线程当中(UI线程中),它与子线程主要是通过Message对象来传递数据,这个时候,Handler就承担着接收子线程传过来的(子线程用sedMessage()方法传递)Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。

   注意:Handler 对象初始化后,就默认与对它初始化的进程的消息队列绑定,因此可以利用Handler所包含的消息队列,制定一些操作的顺序。

 

二、Handler的主要作用

1. 传递Message,用于接收子线程发送过来的数据, 并用此数据配合主线程更新UI。

    在Android中,对于UI的操作通常需要放在主线程中进行操作。如果在子线程中有关于UI的操作,那么就需要把数据消息作为一个Message对象发送到消息队列中,然后,由Handler中的handlerMessge()方法处理传过来的数据信息,并操作UI。当然,Handler对象是在主线程中初始化的,它需要绑定在主线程的消息队列中。

    类sendMessage(Message msg)方法实现发送消息的操作。在初始化Handler对象时重写的handleMessage()方法是用来来接收Messgae并进行相关操作的。

2. 传递Runnable对象,用于通过Handler绑定的消息队列,安排不同操作的执行顺序。

    Handler对象在进行初始化的时候,会默认的自动绑定消息队列。利用类post方法,可以将Runnable对象发送到消息队列中,按照队列的机制按顺序执行不同的Runnable对象中的run方法。

三、Handler的一些特点

handler可以分发Message对象或Runnable对象到主线程中,每个Handler实例,都会被绑定到创建它的线程中(一般是位于主线程)。

      

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(Looper looper)、Handler(Looper looper, Handler.Callback callback) 可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个 Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以 sendMessage。Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在 其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。

本文转载自:http://www.2cto.com/kf/201212/179782.html

共有 人打赏支持
上一篇: android intent机制
下一篇: android的Menu使用
墨梅
粉丝 16
博文 218
码字总数 43367
作品 0
杭州
后端工程师
私信 提问
# Handler在多线程间进行消息通信

Handler在多线程间进行消息通信 主要控件:Handler+Message+MessageQueue+LooperHandler机制及其相关用法: 在andriod世界里handler的作用主要用来处理线程间通信,即我们常说的消息机制,那...

Scus
2017/11/22
0
0
Android中的Handler机制

直接在UI线程中开启子线程来更新TextView显示的内容,运行程序我们会发现,如下错误:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a vie...

Simpleness
2012/06/05
0
8
你真正了解UI线程更新的几种方式吗—面试必备之深度揭秘

你真正了解UI线程更新的几种方式吗——面试必备之UI刷新大解密 我们都知道一般面试的时候都会问道Handler的运行机制。有些时候面试官不会直接问道。但是如果问道UI线程更新的方式有哪几种,你...

codeGoogle
2017/10/26
0
0
Handler机制正常运行的基本条件

根据观察,Handler拥有一个Looper类型的成员变量,handler的sendMessage、obtainMessage以及handler中的handleMessage的调用都是通过这个Looper来完成的。因此Looper是整个Handler机制的基础...

Kingguary
2011/11/28
0
0
全面理解Handler第一步:理解消息队列,手写消息队列

前言 Handler机制这个话题,算是烂大街的内容。但是为什么偏偏重拿出来“炒一波冷饭”呢?因为自己发现这“冷饭”好像吃的不是很明白。最近在思考几个问题,发现以之前对Handler机制的了解是...

MDove
09/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

String转成JSON的实现

String转成JSON 这个依赖很重要,我们将围绕fastjson中的JSONObject这个类来谈转换 欢迎工作一到八年的Java工程师朋友们加入Java高级交流:854630135 本群提供免费的学习指导 架构资料 以及免...

编程SHA
14分钟前
1
0
详解Object.values(),Object.keys(),Object.entries(),Object.create(),includes()

(1)Object.keys() // 返回数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名。 eg:var obj = {a:1,b:'gy'} Object.keys(obj) // ['a','b'] (2)...

JamesView
38分钟前
2
0
SpringBoot中Mybatis打印sql

application.properties中添加 logging.level.com.example.demo.dao=debug com.example.demo.dao 是对应xml中相应interface层...

writeademo
39分钟前
2
0
Git —— 创建版本库和提交回退版本

二、 创建版本库 版本库又叫做仓库,简单理解就是一个目录,这个目录里面所有的文件都可以被Git管理起来,每个文件的修改、删除,Git都可以跟踪,便于追踪历史与还原。找到一个合适的位置,创...

lwenhao
48分钟前
4
0
guava cache使用介绍

今天在项目中发现大量使用guava cache提供缓存,觉得不错。 jvm堆大小为5G /** * * 占用JVM内存,内部数据结构类似于ConcurrentHashMap。因为JVM堆大小的限制,guava cac...

jack_peng
53分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部