`
gybin
  • 浏览: 263391 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android线程间消息处理机制(Looper、Handler和Message)

 
阅读更多

用:Android的线程间消息处理机制主要是用来处理主线程(UI线程)跟工作线程(自己创建的线程)间通信的,如:通过工作线程刷新界面,或者在工作线程中创建一个dialog或者Toast等。

 通常是:Handle定义在UI线程,  工作线程使用 Looper.prepare,进行初始化消息队列,然后使用Handler发生消息回UI线程。

 

一、几个关键概念

1
MessageQueue:是一种
 数据 结构,见名知义,就是一个消息队列,存放消息的地方。每一个线程最多只可以拥有一个MessageQueue数据结构。
创建一个线程的时候,并不会自动 创建其MessageQueue。通常使用一个Looper对象对该线程的MessageQueue进行管理。主线程创建时,会创建一
个默认的Looper对象,而Looper对象的创建,将自动创建一个Message Queue。其他非主线程,不会自动创建Looper,要需要的时候,通过调
prepare函数来实现。

2
Message:消息对象,Message Queue中的存放的对象。一个Message Queue中包含多个Message
 
Message
实例对象的取得,通常使用Message类里的静态方法obtain(),该方法有多个重载版本可供选择;它的创建并不一定是直接创建一个新的实例,
而是先从Message Pool(消息池)中看有没有可用的Message实例,存在则直接取出返回这个实例。如果Message Pool中没有可用的Message实例,
则才用给定的参数创建一个Message对象。调用removeMessages()时,将MessageMessage Queue中删除,同时放入到Message Pool中。除了上面这
种方式,也可以通过Handler对象的obtainMessage()获取 一个Message实例。

3
Looper
 
MessageQueue的管理者。每一个MessageQueue都不能脱离Looper而存在,Looper对象的创建是通过prepare函数来实现的。同时每一个Looper对象
和一个线程关联。通过调用Looper.myLooper()可以获得当前线程的Looper对象
创建一个Looper对象时,会同时创建一个MessageQueue对象。除了主线程有默认的Looper,其他线程默认是没有MessageQueue对象的,所以,不能
接受Message。如需要接受,自己定义 一个Looper对象(通过prepare函数),这样该线程就有了自己的Looper对象和MessageQueue数据结构了。
Looper
MessageQueue中取出Message然后,交由HandlerhandleMessage进行处理。处理完成后,调用Message.recycle()将其放入Message Pool中。

4
Handler
 
消息的处理者,handler 负责将需要传递的信息封装成Message,通过调用handler 对象的obtainMessage()来实现;
将消息传递给Looper,这是通过
handler 对象的sendMessage()来实现的。继而由LooperMessage放入MessageQueue中。
Looper对象看到MessageQueue中含有Message,就将其广播出去。该
handler 对象收到该消息后,调用相应的handler对象的handleMessage()方法
对其进行处理。

 

 

 

 

在一个 非主线程中 必须要:

new Thread()

   {

      public void run()

      {

         Looper.prepare();

         new Handler()

         {

           handleMessage(){}

         }

         Looper.loop();

      }

   }.start()

 

这样 无效:

new Thread()

   {

      public void run()

      {

       //  Looper.prepare();

         new Handler()

         {

           handleMessage(){}

         }

         //Looper.loop();

      }

   }.start()

 

 

 

正因为这样  出现了 HandlerThread  简化了这样的写法

直接HandlerThread   thread = new HandlerThread  (“必须要有一个线程名字”);

必须 thrad.start(); 

才能通过thread.getLoopr()  来得到一个Handler

eg: new Handler(thread.getLooper()){

    ............

};

 

分享到:
评论

相关推荐

    Android单线程模型中Message、Handler、Message Queue、Looper之间的关系---附实例源码

    消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理,在单线程模型下,为了线程通信问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件...

    Android Handler Looper Message 使用示例

    在主线程即UI线程外,新建一个Looper线程,并用Messenger和Handler来处理message和posted runnable。程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按...

    Android消息处理机制Looper和Handler详解

    Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。 Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法...

    自定义Handler-Looper实现线程间通信

    通过自定义Handler、Looper、Message.浅析Android线程间通信原理

    Android_Handler,Looper,Message

    Android ,Handler,Looper,Message

    android线程handler、message、looperDEMO

    博客展示地址:http://blog.csdn.net/icedcap/article/details/20076615

    android+多线程机制的讲解和例子

    1.Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。 2.Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper(从Message Queue...

    android的消息处理机制(图文+源码分析)—Looper/Handler/Message

    这篇文章写的非常好,深入...这不,前几天为了了解android的消息处理机 制,我看了Looper,Handler,Message这几个类的源码,结果又一次被googler的设计震撼了,特与大家分享。 android的消息处理有三个核心类:Looper

    android线程消息机制之Handler详解

    android线程消息机制主要由Handler,Looper,Message和MessageQuene四个部分组成。平常在开发中,我们常用来在子线程中通知主线程来更新,其实整个安卓生命周期的驱动都是通过Handler(ActivityThread.H)来实现的。 ...

    Handler+Looper+MessageQueue+Message机制

    Message(消息):需要被传递的消息,其中包含了消息标识(what),消息处理数据和处理对象(arg1,arg2,obj),发送该消息的Handler对象(target)等,由MessageQueue统一列队,最终由Handler处理。 MessageQueue(消息...

    Android中多线程的Handler原理

    Android中多线程的Handler的工作原理,其中涉及到MessageQueue和Looper。详情可以参见博客:http://www.cnblogs.com/plokmju/p/android_Looper.html

    了解Android核心:Looper,Handler和HandlerThread

    Android中的主线程由 looper 和 Handlers 组成。所以了解创建无阻碍的响应式 UI 很重要。 MessageQueue 是一个队列,其中包含消息任务。 Handler 在 MessageQueue 中以任务形式排队,Looper 在任务出现时执行它们...

    Handler实现线程间通信机制的原理

    文档详细介绍了Handler实现线程间通信过程中源码的实现机制,并对其中的Looper,MessageQueue,Message对象的初始化及sendMessage()通过sendMessageDelayed()和sendMessageAtTime()过程的操作机流程

    深入Android Handler,MessageQueue与Looper关系

    一说到Android的消息机制,自然就会联想到Handler,我们知道Handler是Android消息机制的上层接口,因此我们在开发过程中也只需要和Handler交互即可,很多人认为Handler的作用就是更新UI,这也确实没错,但除了更新UI...

    Android-Handler-Looper-:处理程序,循环程序,消息队列

    android的消息处理有三个核心类:Looper,Handler和Message。其实还有一个MessageQueue(消息队列),但是Message被封装到Looper里面了,我们不会直接与Message打交道,因此我没将其作为核心类。下面一一介绍下: ...

    活用Android的Message Queue

     线程A的Handler对象参考可以传递给别的线程,让别的线程B或C等能送讯息来给线程A(存于A的Message Queue里)。  线程A的Message Queue里的讯息,只有线程A所属的对象可以处理之。  使用Looper.myLooper可以取得...

    Handler机制及原理探究.pdf

    Handler使用简单功能强大,常被用作线程间传递消息的组件,而且还可以用于跨进程。 消息机制背后有包括Looper ,MessageQueue管理和分发消息的实现,同时在Native层也单独实现了一套类 似的机制,接收和处理Native...

    Android学习笔记之Handler处理机制的Looper

    Handler处理机制中,需要Looper来动态的进行循环,以此来不断将MessageQueue的数据取出。 在主线程中,Looper和MessageQueue已经在创建好的,因此我们不用自己创建它们就能用。 而在子线程中,如果我们想用Handler的...

    Android的消息机制

    Android的消息机制主要是指Handler的运行机制,那么什么是Handler的运行机制那?通俗的来讲就是,使用Handler将子线程的Message放入主线程的Messagequeue中,在主线程使用。 二、学习内容 学习Android的消息机制,...

    handler的使用案例

    demo01: 通过handler.post()的方法可以更新ui demo02: 一秒钟切换一张图片 demo03: 霓虹灯动态效果的显示 demo04: 倒计时,停止倒计时 ...demo11: 自己写的looper线程,handler和线程绑定 demo12: 更新ui的四种方式

Global site tag (gtag.js) - Google Analytics