【Android】handler类分析研究

By | 07月03日
Advertisement

我们来看看这篇在51cto.com网站上的文章。

Android中的handler类是它特有的用于管理线程的工具类,方便于线程间通讯.

每一个应用程序(apk),都是一个单独的进程,运行于单独的Dalvik虚拟机实例中,再运行于单独的Linux进程中。每一个进程默认只有一个线程即UI主线程,因为它是以UI界面更新为主要任务的主线程,所以得名。

同样继承于Context的Activity和Service都是跑在同一个线程里的,即UI主线程。这样他们之间是相互阻塞的,当Service运行较为费时的工作,而Activity上的UI界面需要更新导致程序卡住时,就会导致程序被系统Kill掉。解决办法是Service需要开用更多的线程来运行费时的工作,例如:播放音乐,网络下载等。

那么开辟的线程怎样与UI主线程互相协调工作呢,这就得需要用到Handler了。这个谷歌煞费苦心的发明确实有神奇的作用。最主要的作用是管理线程间的消息通讯。

UI主线程里初始化时自带一个消息队列(MessageQueen),需要用Looper进行管理。Looper的主要作用是循环迭代MessageQueen,加入新的Message,轮到这条消息时再发送出去。而Handler就可以直接操作Looper了,例如:
Handler mHandler = new Handler(Looper.getMainLooper);就是用mHandler对象控制UI主线程的Looper对象,也就是控制了MessageQueen。而:
Handler mHandler = new Handler(Looper.myLooper);就是控制当前线程(也可能是UI主线程)的MessageQueen。

那么Handler控制了各个线程的MessageQueen就可以实现,主线程与子线程的相互通信,传递消息队列,分派任务等复杂的工作了。具体可参见高焕堂的Android的MessageQueen一文。

Handler还有一个用处,就是缓和任务冲突。当UI急需更新但是任务却在繁忙状态时,为了避免被系统杀死,这时最好利用Handler发送简单消息通知UI主线程更新界面,UI主线程在运行时会在空闲时取出消息解析运行,这样就不会造成任务冲突了。但是这样也可能会造成界面看起来一卡一卡的,最好的办法还是开辟一个新的线程来分摊工作。

有些没有界面的任务比如Service运行时需要更新UI界面,例如弹出对话框(Dialog),那就得通过Handler来发送消息,通知UI线程更新界面,这样才能弹出对话框。

Similar Posts:

  • Android中消息循环机制Looper和Handler类分析(二)

    Looper类说明 Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在run()方法中的内容执行完之后就退出了,即线程做完自己的工作之后就结束了,没有循环的概念. 调用Looper类的 prepare() 方法可以为当前线程创建一个消息循环,调用loop() 方法使之处理信息,直到循环结束. 大多数和消息循环的交互是通过 Handler 类进行的. 下面是一个典型的实现: class LooperThread extends Thread

  • Android Handler、LOOP和Message

    一,相关概念 在Android中如果通过用户界面(如button)来来启动线程,然后再线程中的执行代码将状态信息输出到用户界面(如文本框),这时候就会抛出以下的异常信息: 5-12 13:33:04.393: ERROR/JavaBinder(1029):android.view.ViewRoot$CalledFromWrongThreadException:Onlythe original thread that created a view hierarchy can touch its v

  • android Handler导致内存泄露分析

    Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // do something. } } 当我们这样创建`Handler`的时候`Android Lint`会提示我们这样一个`warning: In Android, Handler classes should be static or leaks might occur.`. 一直以来没有仔细的去分析泄露的原因,先把主要

  • Android个人每天总结.doc(day06 多线程&Handler类&四大组件之:Activity)

    作者:韩亚飞_yue31313_韩梦飞沙 QQ:313134555 day06 多线程&Handler类&四大组件之:Activity Ø 多线程下载及断点续传 一.RandomAccessFile类:io包下(用于多线程下载) 随机访问文件: 作用:可以读文件也能写文件 seek()向指定位置读和写 void seek(long pos) 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作. setLength(大小)设定一个文件的初始大小 writeLong(lo

  • android常见类(Thread Handler Looper相关)

    NOTE: 以下路径相对于android源码下 以下类容主要介绍,线程中消息处理及循环 〇.关系图 为了便于理解,从网络上摘录的关系流程图,这些图在看完代码再来看比较好. 一.ThreadLocal 线程局部存储(ThreadLocalStorage)当从同一线程中引用该变量时,其值总是相同:而从不同的线程中引用该变量时,其值应该不同. 方法成员变量:仅在方法内部有效 类成员变量:仅在对象内部有效 线程局部存储(TLS)变量:在本线程内的任何对象内保持一致 静态变量:在本进程内的任何对象内保持一

  • Android Project Butter分析

    Android Project Butter分析 一背景知识介绍 随着时间的推移,Android OS系统一直在不断进化.壮大,日趋完善.但直到Android 4.0问世,有关UI显示不流畅的问题也一直未得到根本解决.在整个进化过程中,Android在Display(显示)系统这块也下了不少功夫,例如,使用硬件加速等技术,但本质原因似乎和硬件关系并不大,因为iPhone的硬件配置并不比那些价格相近的Android机器的硬件配置强,而iPhone UI的流畅性强却是有目共睹的. 从Android

  • Android Handler 机制

    参考文章: 深入理解Handler机制 Android 事件机制详解 Android Handler消息机制的理解 android的消息处理机制(图+源码分析)--Looper,Handler,Message 概述 在开发中,Handler通常用于异步消息处理,相关联的类有: ThreadLocal.Looper.MessageQueue.Message.Handler. Handler持有MessageQueue和Looper,而Looper维护着一个MessageQueue,Message中

  • 图解 Android Handler 线程消息机制

    从现实生活中理解线程消息机制 android 有一种叫消息队列的说法,这里我们可以这样理解:假如一个隧道就是一个消息队列,那么里面的每一部汽车就是一个一个消息,这里我们先忽略掉超车等种种因素,只那么先进隧道的车将会先出,这个机制跟我们android 的消息机制是一样的. Android 的线程消息机制 android 在设计的时候引入了 wince 的消息机制,即将每一个消息发送到队列里面,遵循先进先出原则.发送消息并不会阻塞线程,而接收线程会阻塞线程,这是因为 Android 的Handler

  • [转载]Android Project Butter分析

    Android Project Butter分析 一背景知识介绍 随着时间的推移,Android OS系统一直在不断进化.壮大,日趋完善.但直到Android 4.0问世,有关UI显示不流畅的问题也一直未得到根本解决.在整个进化过程中,Android在Display(显示)系统这块也下了不少功夫,例如,使用硬件加速等技术,但本质原因似乎和硬件关系并不大,因为iPhone的硬件配置并不比那些价格相近的Android机器的硬件配置强,而iPhone UI的流畅性强却是有目共睹的. 从Android

  • Android Handler的深入剖析

    [Handler的简单用法] Handler类的作用之一: 在新启动的线程中发送消息. 在主线程中获取.处理消息. 为了让主程序能"适时"地处理新启动的线程所发送的消息,显然只能通过回调的方式来实现--开发者只要重写Handler类中处理消息的方法,当新启动的线程发送消息时,消息会发送到与之关联的MessageQueue,而Handler会不断地从MessageQueue中获取并处理消息--这将导致Handler类中处理消息的方法被回调. Handler类包含如下方法用于发送.处理消息

Tags: