你的位置:首页 > 软件开发 > 操作系统 > Handler消息传递机制

Handler消息传递机制

发布时间:2016-03-08 12:00:15
出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题。为了解决这个问题,Android制定了一条简单的规则:只允许UI线程修改Activity里的UI组件。 当一个程序第一次启动时,A ...

       出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题。为了解决这个问题,Android制定了一条简单的规则:只允许UI线程修改Activity里的UI组件。

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

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

Handler类简介

   Handler类的主要作用有两个:

     1、在新启动的线程中发送消息。

     2、在主线程中获取、处理消息。

   为了让主线程能“适时”地处理新启动的线程所发送的消息,显然只能通过回调的方式来实现——开发者只要重写 Handler 类中处理消息的方法,当新启动的线程发送消息时,消息会发送到与之关联的 MessageQueue ,而 Handler 会不断地从MessageQueue 中获取并处理消息——这将导致 Handler 类中处理消息的方法被回调。

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

  1、void handleMessage(Message msg):处理消息的方法。该方法通常用于被重写。

  2、final boolean hasMessages(int what):检查消息队列中是否包含what属性为指定值得消息。

  3、final boolean hsaMessages(int what,Object object):检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息。

  4、多个重载的 Message obtainMessage():获取消息。

  5、sendEmptyMessage(int what):发送空消息。

  6、final boolean sendEmptyMessageDelayed(int what,long delayMills):指定多少毫秒之后发送空消息。

  7、final boolean sendMessage(Message msg):立即发送消息。

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

借助于上面这些方法,程序可以方便地利用Handler 类进行消息传递。

Handler、Loop、MessageQueue的工作原理

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

  1、Message:Handler 接受和处理的消息对象

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

  3、MessageQueue:消息队列,它采用先进先出的方法来管理Message。程序创建Looper对象时会在它的构造器中创建Looper对象。Looper 提供的构造器源代码如下:

1 private Looper()2 {3  mQueue=new MessageQueue();4  mRun=true;5  mThread=Thread.currentThread();6 }

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:Handler消息传递机制

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录