安卓开发中Handler消息传递机制

原创 2015年11月21日 19:08:56

        在安卓开发中,经常会遇到让程序在运行过程中修改界面属性的问题,然而当我们试图用其他线程机制(如timer线程)去修改界面属性时,会经常出现程序挂掉的问题,这也让好多初学安卓开发的人感到莫名其妙。

        在我们深入了解一些安卓开发机制之后,就会明白出现这样问题的原因:出于性能优化考虑,安卓的UI操作并不是线程安全的,尤其是有多个线程并发操作UI组件时,可能导致线程安全问题。为了安全问题考虑,安卓制订了一条简单的规则:只允许UI线程修改Activity里的UI组件。

        当一个程序第一次启动时,安卓会同时启动一条主线程(Main Thread),主线程负责处理与UI相关的事件,如按键事件、接触屏幕事件及屏幕绘图事件等,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。

        安卓的消息传递机制是另一种形式的“事件处理”,这种机制主要是为了解决安卓应用的多线程问题——安卓平台只允许UI线程修改Activity里的UI组件,这样就会导致新启动的线程无法动态改变界面组件的属性值。但在实际安卓应用开发中,尤其是需要让新启动的线程周期性地改变界面组件的属性值,这就需要借助于Handler消息传递机制来实现了。下面就给大家分享一下Handler消息传递机制的一些内容。

        1、Handler类:主要有两个作用:在新启动的线程中发送消息;在主线程中获取和处理消息。

              然而,在新启动的线程中发送消息,再在主线程中获取和处理消息的时机并不好控制。所以在这里只能通过回调的方式来实现——只需重写Handler类中的处理消息的方法,当新启动的线程发送消息时,消息会发送到与之关联的MessageQueue,而Handler会不断地从MessageQueue中获取并处理消息——这时Handler类中处理消息的方法会被回调。

              Handler类包含如下方法用于发送、处理消息:

             * 处理消息的方法:void handlerMessage(Message msg)

             *检查消息队列中是否包含what属性为指定值的消息:finally boolean hasMessages(int what)

             *检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息:finally boolean hasMessages(int what,Object object)

             *获取消息:多个重载的Message obtainMessage()

             *发送空消息:sendEmptyMessage(int what)

             *指定多少毫秒之后发送空消息:final boolean sendEmptyMessageDelayed(int what,long delayMillis)

             *立即发送消息:final boolean sendMessage(Message msg)

             *指定多少毫秒后发送消息:final boolean sendMessageDelayed(Message msg,long delayMillis)

        2、Handler、Loop、MessageQueue的工作原理:

             为了更好地理解Handler的工作原理,先介绍一下与Handler一起工作的几个组件。

             Message:Handler接收和处理的消息对象

             Looper:每个线程只能拥有一个Looper。它的Loop方法负责读取MessageQueue中的消息,读到信息之后就把消息交给发送该消息的Handler进行处理

             MessageQueue:消息队列,它采用先进先出的方式来管理Message。程序创建Looper对象时会在它的构造器中创建Looper对象。

             程序使用Handler发送消息时,被Handler发送的消息必须被送到指定的MessageQueue,否则消息无法保存。而MessageQueue是由Looper负责管理的,即必须在当前线程中有Looper对象,可以分如下两种情况处理:

             1)主UI线程中,系统已经初始化了一个Looper对象,因此程序直接创建Handler即可,然后就可通过Handler来发送和处理消息。

             2)程序员自己启动的子线程,必须手动创建一个Looper对象,并启动它。创建Looper对象调用它的prepare()方法即可。该方法可以保证每个线程最多只有一个Looper对象。

             然后调用Looper的静态loop()方法来启动它。loop()方法使用了一个死循环不断取出MessageQueue中的消息,并将取出的消息分给该消息对应的Handler进行处理。

             至此。我们可以总结在线程中使用Handler的步骤:

             1)调用Looper的prepare()方法为当前线程创建Looper对象,它的构造器会创建与之配套的MessageQueue。

             2)创建Handler子类的实例,重写handleMessage()方法,该方法负责处理来自于其他线程的消息。

             3)调用Looper的loop()方法来启动Looper。

              在我的另一篇博文“安卓动态曲线的绘制”和我上传的“闪光灯频闪测试” 源码中对Handler机制都有使用,大家可以作为实例来参考理解。          

版权声明:本文为博主原创文章,转载请注明出处。 举报

相关文章推荐

安卓Handler,Looper消息传递机制

1.Handler出现的原因:   首先安卓高版本不允许直接在主线程中执行一些耗时操作,因为会造成ANR,影响用户体验,耗时操作包括:   网络访问,耗时运算,阻塞式的IO,因此我们必须开启一个子...

Android开发之Handler消息传递机制

Handler的定义: 如果通过子线程的方法对UI界面进行操作,将抛出异常,Android中引入了Handler消息传递机制主要接受子线程发送的数据,并用此数据配合主线程更新UI。 解释:当应用程...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

【Android开发】线程与消息处理-Handler消息传递机制之Looper

在前面已经介绍了在Android中如何创建、开启、休眠和中断线程。不过,此时并没有在新创建的子线程中对UI界面上的内容进行操作,如果应用前面介绍的方法对UI界面进行操作,将抛出异常。 为此,Andr...

深入理解Handler消息传递机制详解

Handler详解 1、出于线程考虑,Android的UI不是线程安全的,者意味着如果有多个线程并发操作UI组件,可能导致线程安全问题。为了解决这一问题,Android指定了一个简单的规则:只允许UI...

android学习之——Handler消息传递机制

Android的消息传递机制是另一种形式的“事件处理”,这种机制主要是为了解决Android应用的多线程问题——Android平台只允许UI线程修改Activity里的组件,这样就会导致 新启动的线...
  • csxwc
  • csxwc
  • 2013-07-21 00:40
  • 1019

Handler消息传递机制

一、Handler消息传递机制的产生原因 出于对性能优化的考虑,致使Android不是线程安全的。如果多个线程并发操作UI组件,会产生线程安全问题。为此,Android制定了一个规则:只允许在UI线程...

Android学习历程10-Handler消息传递机制

Handler消息传递机制

Handler消息传递机制

Handler消息传递机制

Handler, Message 消息传递机制

Handler, Message 消息传递机制 + 个人理解

Handler消息传递机制

Handler消息传递机制  对于android来说,ui非常重要,所以为了保证ui的性能,google公司吧ui设计成了线程不安全的(速度快),并且只允许主线程对ui组件进行修改,但是在实际的项目...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)