android消息处理机制--Looper

WorkVisual 6.0 从零搭建机器人控制与I/O映射系统 本文详细介绍了如何使用WorkVisual 6.0从零搭建机器人控制与I/O映射系统。通过控制柜选择、机器人模型配置和I/O映射等关键步骤的实战解析,帮助工程师高效完成工业机器人配置系统搭建,提升项目执行效率。文章特别强调了版本管理和模块化编址方案等实用技巧。 阅读详情

From:http://blog.youkuaiyun.com/faith_boys/article/details/8100197

本文将分析Android内的looper,这个是用来封装消息循环和消息队列的一个类,handler其实可以看做是一个工具类,用来向消息队列中插入消息的。好比是WindowsAPI的SendMessage中的HANDLE,这个handle是窗口句柄。

  1. //Looper类分析  

  2. public class Looper {  

  3.    //static变量,判断是否打印调试信息。  

  4.     private static final boolean DEBUG = false;  

  5.     private static final boolean localLOGV = DEBUG ? Config.LOGD : Config.LOGV;  

  6.   

  7.     // sThreadLocal.get() will return null unless you've called prepare().  

  8. //线程本地存储功能的封装,TLS,thread local storage,什么意思呢?因为存储要么在栈上,例如函数内定义的内部变量。要么在堆上,例如new或者malloc出来的东西  

  9. //但是现在的系统比如Linux和windows都提供了线程本地存储空间,也就是这个存储空间是和线程相关的,一个线程内有一个内部存储空间,这样的话我把线程相关的东西就存储到  

  10. //这个线程的TLS中,就不用放在堆上而进行同步操作了。  

  11.     private static final ThreadLocal sThreadLocal = new ThreadLocal();  

  12. //消息队列,MessageQueue,看名字就知道是个queue..  

  13.     final MessageQueue mQueue;  

  14.     volatile boolean mRun;  

  15. //和本looper相关的那个线程,初始化为null  

  16.     Thread mThread;  

  17.     private Printer mLogging = null;  

  18. //static变量,代表一个UI Process(也可能是service吧,这里默认就是UI)的主线程  

  19.     private static Looper mMainLooper = null;  

  20.       

  21.      /** Initialize the current thread as a looper. 

  22.       * This gives you a chance to create handlers that then reference 

  23.       * this looper, before actually starting the loop. Be sure to call 

  24.       * {@link #loop()} after calling this method, and end it by calling 

  25.       * {@link #quit()}. 

  26.       */  

  27. //往TLS中设上这个Looper对象的,如果这个线程已经设过了looper的话就会报错  

  28. //这说明,一个线程只能设一个looper  

  29.     public static final void prepare() {  

  30.         if (sThreadLocal.get() != null) {  

  31.             throw new RuntimeException("Only one Looper may be created per thread");  

  32.         }  

  33.         sThreadLocal.set(new Looper());  

  34.     }  

  35.       

  36.     /** Initialize the current thread as a looper, marking it as an application's main  

  37.      *  looper. The main looper for your application is created by the Android environment, 

  38.      *  so you should never need to call this function yourself. 

  39.      * {@link #prepare()} 

  40.      */  

  41.  //由framework设置的UI程序的主消息循环,注意,这个主消息循环是不会主动退出的  

  42. //      

  43.     public static final void prepareMainLooper() {  

  44.         prepare();  

  45.         setMainLooper(myLooper());  

  46. //判断主消息循环是否能退出....  

  47. //通过quit函数向looper发出退出申请  

  48.         if (Process.supportsProcesses()) {  

  49.             myLooper().mQueue.mQuitAllowed = false;  

  50.         }  

  51.     }  

  52.   

  53.     private synchronized static void setMainLooper(Looper looper) {  

  54.         mMainLooper = looper;  

  55.     }  

  56.       

  57.     /** Returns the application's main looper, which lives in the main thread of the application. 

  58.      */  

  59.     public synchronized static final Looper getMainLooper() {  

  60.         return mMainLooper;  

  61.     }  

  62.   

  63.     /** 

  64.      *  Run the message queue in this thread. Be sure to call 

  65.      * {@link #quit()} to end the loop. 

  66.      */  

  67. //消息循环,整个程序就在这里while了。  

  68. //这个是static函数喔!  

  69.     public static final void loop() {  

  70.         Looper me = myLooper();//从该线程中取出对应的looper对象  

  71.         MessageQueue queue = me.mQueue;//取消息队列对象...  

  72.         while (true) {  

  73.             Message msg = queue.next(); // might block取消息队列中的一个待处理消息..  

  74.             //if (!me.mRun) {//是否需要退出?mRun是个volatile变量,跨线程同步的,应该是有地方设置它。  

  75.             //    break;  

  76.             //}  

  77.             if (msg != null) {  

  78.                 if (msg.target == null) {  

  79.                     // No target is a magic identifier for the quit message.  

  80.                     return;  

  81.                 }  

  82.                 if (me.mLogging!= null) me.mLogging.println(  

  83.                         ">>>>> Dispatching to " + msg.target + " "  

  84.                         + msg.callback + ": " + msg.what  

  85.                         );  

  86.                 msg.target.dispatchMessage(msg);  

  87.                 if (me.mLogging!= null) me.mLogging.println(  

  88.                         "<<<<< Finished to    " + msg.target + " "  

  89.                         + msg.callback);  

  90.                 msg.recycle();  

  91.             }  

  92.         }  

  93.     }  

  94.   

  95.     /** 

  96.      * Return the Looper object associated with the current thread.  Returns 

  97.      * null if the calling thread is not associated with a Looper. 

  98.      */  

  99. //返回和线程相关的looper  

  100.     public static final Looper myLooper() {  

  101.         return (Looper)sThreadLocal.get();  

  102.     }  

  103.   

  104.     /** 

  105.      * Control logging of messages as they are processed by this Looper.  If 

  106.      * enabled, a log message will be written to <var>printer</var>  

  107.      * at the beginning and ending of each message dispatch, identifying the 

  108.      * target Handler and message contents. 

  109.      *  

  110.      * @param printer A Printer object that will receive log messages, or 

  111.      * null to disable message logging. 

  112.      */  

  113. //设置调试输出对象,looper循环的时候会打印相关信息,用来调试用最好了。  

  114.     public void setMessageLogging(Printer printer) {  

  115.         mLogging = printer;  

  116.     }  

  117.       

  118.     /** 

  119.      * Return the {@link MessageQueue} object associated with the current 

  120.      * thread.  This must be called from a thread running a Looper, or a 

  121.      * NullPointerException will be thrown. 

  122.      */  

  123.     public static final MessageQueue myQueue() {  

  124.         return myLooper().mQueue;  

  125.     }  

  126. //创建一个新的looper对象,  

  127. //内部分配一个消息队列,设置mRun为true  

  128.     private Looper() {  

  129.         mQueue = new MessageQueue();  

  130.         mRun = true;  

  131.         mThread = Thread.currentThread();  

  132.     }  

  133.   

  134.     public void quit() {  

  135.         Message msg = Message.obtain();  

  136.         // NOTE: By enqueueing directly into the message queue, the  

  137.         // message is left with a null target.  This is how we know it is  

  138.         // a quit message.  

  139.         mQueue.enqueueMessage(msg, 0);  

  140.     }  

  141.   

  142.     /** 

  143.      * Return the Thread associated with this Looper. 

  144.      */  

  145.     public Thread getThread() {  

  146.         return mThread;  

  147.     }  

  148.     //后面就简单了,打印,异常定义等。  

  149.     public void dump(Printer pw, String prefix) {  

  150.         pw.println(prefix + this);  

  151.         pw.println(prefix + "mRun=" + mRun);  

  152.         pw.println(prefix + "mThread=" + mThread);  

  153.         pw.println(prefix + "mQueue=" + ((mQueue != null) ? mQueue : "(null"));  

  154.         if (mQueue != null) {  

  155.             synchronized (mQueue) {  

  156.                 Message msg = mQueue.mMessages;  

  157.                 int n = 0;  

  158.                 while (msg != null) {  

  159.                     pw.println(prefix + "  Message " + n + ": " + msg);  

  160.                     n++;  

  161.                     msg = msg.next;  

  162.                 }  

  163.                 pw.println(prefix + "(Total messages: " + n + ")");  

  164.             }  

  165.         }  

  166.     }  

  167.   

  168.     public String toString() {  

  169.         return "Looper{"  

  170.             + Integer.toHexString(System.identityHashCode(this))  

  171.             + "}";  

  172.     }  

  173.   

  174.     static class HandlerException extends Exception {  

  175.   

  176.         HandlerException(Message message, Throwable cause) {  

  177.             super(createMessage(cause), cause);  

  178.         }  

  179.   

  180.         static String createMessage(Throwable cause) {  

  181.             String causeMsg = cause.getMessage();  

  182.             if (causeMsg == null) {  

  183.                 causeMsg = cause.toString();  

  184.             }  

  185.             return causeMsg;  

  186.         }  

  187.     }  

  188. }  

那怎么往这个消息队列中发送消息呢??调用looper的static函数myQueue可以获得消息队列,这样你就可用自己往里边插入消息了。不过这种方法比较麻烦,这个时候handler类就发挥作用了。先来看看handler的代码,就明白了。


  1. class Handler{  

  2. ..........  

  3. //handler默认构造函数  

  4. public Handler() {  

  5. //这个if是干嘛用的暂时还不明白,涉及到Java的深层次的内容了应该  

  6.         if (FIND_POTENTIAL_LEAKS) {  

  7.             final Class<? extends Handler> klass = getClass();  

  8.             if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&  

  9.                     (klass.getModifiers() & Modifier.STATIC) == 0) {  

  10.                 Log.w(TAG, "The following Handler class should be static or leaks might occur: " +  

  11.                     klass.getCanonicalName());  

  12.             }  

  13.         }  

  14. //获取本线程的looper对象  

  15. //如果本线程还没有设置looper,这回抛异常  

  16.         mLooper = Looper.myLooper();  

  17.         if (mLooper == null) {  

  18.             throw new RuntimeException(  

  19.                 "Can't create handler inside thread that has not called Looper.prepare()");  

  20.         }  

  21. //无耻啊,直接把looper的queue和自己的queue搞成一个了  

  22. //这样的话,我通过handler的封装机制加消息的话,就相当于直接加到了looper的消息队列中去了  

  23.         mQueue = mLooper.mQueue;  

  24.         mCallback = null;  

  25.     }  

  26. //还有好几种构造函数,一个是带callback的,一个是带looper的  

  27. //由外部设置looper  

  28.     public Handler(Looper looper) {  

  29.         mLooper = looper;  

  30.         mQueue = looper.mQueue;  

  31.         mCallback = null;  

  32.     }  

  33. // 带callback的,一个handler可以设置一个callback。如果有callback的话,  

  34. //凡是发到通过这个handler发送的消息,都有callback处理,相当于一个总的集中处理  

  35. //待会看dispatchMessage的时候再分析  

  36. public Handler(Looper looper, Callback callback) {  

  37.         mLooper = looper;  

  38.         mQueue = looper.mQueue;  

  39.         mCallback = callback;  

  40.     }  

  41. //  

  42. //通过handler发送消息  

  43. //调用了内部的一个sendMessageDelayed  

  44. public final boolean sendMessage(Message msg)  

  45.     {  

  46.         return sendMessageDelayed(msg, 0);  

  47.     }  

  48. //FT,又封装了一层,这回是调用sendMessageAtTime了  

  49. //因为延时时间是基于当前调用时间的,所以需要获得绝对时间传递给sendMessageAtTime  

  50. public final boolean sendMessageDelayed(Message msg, long delayMillis)  

  51.     {  

  52.         if (delayMillis < 0) {  

  53.             delayMillis = 0;  

  54.         }  

  55.         return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);  

  56.     }  

  57.   

  58.   

  59. public boolean sendMessageAtTime(Message msg, long uptimeMillis)  

  60.     {  

  61.         boolean sent = false;  

  62.         MessageQueue queue = mQueue;  

  63.         if (queue != null) {  

  64. //把消息的target设置为自己,然后加入到消息队列中  

  65. //对于队列这种数据结构来说,操作比较简单了  

  66.             msg.target = this;  

  67.             sent = queue.enqueueMessage(msg, uptimeMillis);  

  68.         }  

  69.         else {  

  70.             RuntimeException e = new RuntimeException(  

  71.                 this + " sendMessageAtTime() called with no mQueue");  

  72.             Log.w("Looper", e.getMessage(), e);  

  73.         }  

  74.         return sent;  

  75.     }  

  76. //还记得looper中的那个消息循环处理吗  

  77. //从消息队列中得到一个消息后,会调用它的target的dispatchMesage函数  

  78. //message的target已经设置为handler了,所以  

  79. //最后会转到handler的msg处理上来  

  80. //这里有个处理流程的问题  

  81. public void dispatchMessage(Message msg) {  

  82. //如果msg本身设置了callback,则直接交给这个callback处理了  

  83.         if (msg.callback != null) {  

  84.             handleCallback(msg);  

  85.         } else {  

  86. //如果该handler的callback有的话,则交给这个callback处理了---相当于集中处理  

  87.           if (mCallback != null) {  

  88.                 if (mCallback.handleMessage(msg)) {  

  89.                     return;  

  90.                 }  

  91.            }  

  92. //否则交给派生处理,基类默认处理是什么都不干  

  93.             handleMessage(msg);  

  94.         }  

  95.     }  

  96. ..........  

  97. }  

 讲了这么多,该怎么创建和使用一个带消息循环的线程呢?

  1. //假设在onCreate中创建一个线程  

  2. //不花时间考虑代码的完整和严谨性了,以讲述原理为主。  

  3. ....  

  4.   

  5. ... onCreate(...){  

  6.   

  7. //难点是如何把android中的looper和java的thread弄到一起去。  

  8. //而且还要把随时取得这个looper用来创建handler  

  9. //最简单的办法就是从Thread派生一个  

  10. class ThreadWithMessageHandle extends Thread{  

  11.   //重载run函数  

  12.   Looper myLooper = null;  

  13.   run(){  

  14.   Looper.prepare();//将Looper设置到这个线程中  

  15.   myLooper = Looper.myLooper();  

  16.   Looper.loop();开启消息循环  

  17. }  

  18.   

  19.  ThreadWithMessageHandle  threadWithMgs = new ThreadWithMessageHandle();  

  20.  threadWithMsg.start();  

  21.  Looper looper = threadWithMsg.myLooper;//  

  22. //这里有个问题.threadWithMgs中的myLooper可能此时为空  

  23. //需要同步处理一下  

  24. //或者像API文档中的那样,把handler定义到ThreadWithMessageHandle到去。  

  25. //外线程获得这个handler的时候仍然要注意同步的问题,因为handler的创建是在run中的  

  26.  Handler threadHandler = new Handler(looper);  

  27.  threadHandler.sendMessage(...)  

  28. }  

  29. }

用树莓派Pico低成本更新USB-C PD控制器固件实战指南 固件更新是嵌入式系统开发与维护中的核心环节,它直接决定了硬件设备的功能、性能与兼容性。其原理通常是通过特定的通信接口(如SWD、JTAG、UART或USB)与设备内部的Bootloader建立连接,将新的程序代码安全写入非易失性存储器。在USB Power Delivery(PD)和Type-C生态中,固件更新技术尤为重要,它能修复协议握手Bug、适配新设备并提升供电策略的灵活性。本文聚焦于一个典型的工程实践场景:如何利用广泛普及且成本极低的树莓派Pico开发板,作为USB-C协议到I²C协议的转换桥,实现 阅读详情

相关推荐

jason-2卫星介绍及其数据下载

两台仪器发射脉冲宽度均为105.6μs,带宽320MHz(C频段)和320/100MHz(Ku频段),脉冲重复频率1800Hz(Ku频段)和300Hz(C频段),功率78W,数据传输速率22.5kbit/s。共发射了3颗卫星(Jason - 1/2/3),星上有效载荷均主要为雷达高度计和微波辐射计。Jason - 1卫星主要有效载荷为波塞冬 - 2和“贾森微波辐射计”,Jason - 2卫星进行了改进,主要携带了波塞冬 - 3和先进微波辐射计,此外,Jason - 2卫星还携带了“多里斯”系统。

beautyaaaa的博客 1606

详解HandlerInterceptor接口(记录)

实现HandlerInterceptor接口可以帮助我们拦截HTTP请求,并在请求处理之前、之后、以及完成之后执行自定义的逻辑。

weixin_55829616的博客 3082

Unity开源游戏源码精选:17个亲测可运行教学项目

Unity游戏开发中,掌握真实项目结构与工程实践远比熟记API更重要。本文围绕‘Unity开源项目’和‘游戏源码’两大核心概念,解析高质量开源资源的本质特征——结构清晰、逻辑可溯、修改即时反馈。从基础的MonoBehaviour生命周期组织,到进阶的ScriptableObject数据驱动、事件总线解耦,再到架构级的DOTS ECS设计与网络同步模式,技术价值在于将抽象原理落地为可调试、可验证、可迁移的代码范式。适用于新手建立开发直觉、中级开发者突破系统设计瓶颈,以及团队构建可维护框架。所有项目均基于Uni

weixin_31528001的博客 722

android消息处理机制-------Looper

<!-- @page {margin:2cm} p {margin-bottom:0.21cm; direction:ltr; color:#000000; widows:2; orphans:2} a:link {color:#0000ff} --> 。 本文将分析android内的looper,这个是用来封装消息循环和消息队列的一个类,han

faith_boys的专栏 680

VC Spyglass:Lint实战指南之TCL脚本自动化解析

本文详细介绍了如何利用TCL脚本实现VC Spyglass Lint检查的自动化流程。通过实战指南,从基础脚本编写到高级参数化技巧,帮助数字IC设计工程师摆脱手动操作,提升验证效率,并实现与CI/CD流程的集成。

h3i4j的博客 799

纽扣电池供电系统优化:NBM5100A与STM32F745VG组合方案

在低功耗物联网设备设计中,能量管理是核心挑战之一。纽扣电池因其体积小、成本低被广泛采用,但瞬时大电流需求常导致电压骤降和寿命缩短。通过超级电容缓冲技术,可以实现能量的细水长流式存储与集中释放。NBM5100A电源管理IC与STM32F745VG微控制器的组合方案,采用双阶段能量管理架构,先以恒定小电流充电,再通过电容释放大电流。这种方案不仅能提升系统稳定性,还能延长电池寿命3-5倍,特别适合智能门锁、无线传感器等需要间歇性高功率输出的场景。

weixin_29194255的博客 257

Android消息机制剖析—Looper篇

本篇文章在android6.0基础上分析。 Looper在消息机制中扮演的角色是创造无限循环从Messagequeue中取得消息然后分发。 一、Looper的创建 只要调用Looper.prepare()方法之后,然后再Looper.loop()即可,这里两个方法都是static方法,表面没有任何Looper对象的参与,具体如何 先来看下prepare()这个方法: pub

加油吧 王小二 1294

避坑指南:华为2288H-V5服务器安装系统时常见的RAID与驱动问题解决方案

本文针对华为2288H-V5服务器在安装系统时常见的RAID与驱动问题,提供了详细的避坑指南。文章深度解析了从BIOS版本兼容性核查、RAID配置实战到驱动加载与集成的全流程,重点解决了安装过程中因RAID控制器驱动缺失或兼容性问题导致的硬盘无法识别等典型故障,帮助用户高效完成系统部署。

weixin_29240711的博客 983

五分钟搞懂Android的消息机制(Handle,Looper,MessageQueue)

引言: 提到消息机制相比各位都应该不是很陌生,日常开发的过长中肯定难免遇到这方面的问题。Handle的运行需要底层的Looper,MessageQueue进行支撑。MessageQueue的中文翻译是消息队列,说白了,他的内部储存了信息,以队列的形式来提供插入和删除的工作。虽说是队列,但是其内部的实现确实单链表。而MessageQueue只提供了对于消息的存储功能,但是如果要对消息进行遍历和处理的

cuishikun9527的博客 1245

使用BK3432芯片进行蓝牙开发的详细指南:编程手册与实际应用

BK3432是一款蓝牙4.2双模式芯片,支持蓝牙低功耗(BLE)和经典蓝牙(BR/EDR)模式。它集成了高性能的RF收发器、基带处理器、ARM9E内核、丰富的功能外设单元,并支持BLE应用的可编程协议和概要文件。蓝牙版本:4.2数据速率:最高支持2Mbps内核:ARM9ERF收发器:高性能、低功耗外设单元:包括UART、SPI、I2C、GPIO等功耗:超低功耗设计,适合电池供电的应用。

m0_57781768的博客 4456

[xboard-ok210] 44 s5pv210开发板介绍和对比

文章目录前言四大S3C6410提供商友坚开发板UT-S5PV210华天正(润尔)real210飞凌开发板ok210九鼎x210友善之臂开发板tiny210mini210smart210天嵌开发板tq210sate210xboardxboardxboard之ok210 前言 四大S3C6410提供商 友坚开发板 UT-S5PV210 华天正(润尔) real210 飞凌开发板 ok210 九鼎 x210 友善之臂开发板 tiny210 mini210 smart210 天嵌开发板 tq210 sate210

鹰之翔 289

Android应用程序消息处理机制(Looper、Handler)分析

Android应用程序是通过消息来驱动的,系统为每一个应用程序维护一个消息队例,应用程序的主线程不断地从这个消息队例中获取消息(Looper),然后对这些消息进行处理(Handler),这样就实现了通过消息来驱动应用程序的执行,本文将详细分析Android应用程序的消息处理机制。        前面我们学习Android应用程序中的Activity启动(Android应用程序启动过程源代码分析和A

老罗的Android之旅 11万+

基于自适应小波阈值算法的图像去噪

自适应小波阈值算法是一种基于小波变换的方法,它相对于传统的小波阈值去噪方法具有更好的性能和鲁棒性。该算法首先对图像进行小波变换,然后根据小波系数的大小确定一个自适应的阈值,将小波系数与阈值进行比较,大于阈值的系数被保留,小于阈值的系数被置零。在上述代码中,首先选取了小波函数sym4进行小波分解,然后根据标准差计算出阈值,使用wthresh函数进行阈值处理,最后进行反变换得到处理后的图像。该GUI界面与前面的自适应小波阈值算法代码结合,实现了图像的去噪,并提供了可视化的效果。

与其临渊羡鱼,不如退而结网 559

Android消息处理机制 handler looper messagequene

Android消息处理机制 2011-10-28 13:36 2396人阅读 评论(5) 收藏 举报 Google参考了Windows的消息处理机制,在Android系统中实现了一套类似的消息处理机制。学习Android的消息处理机制,有几个概念(类)必须了解: 1.       Message 消息,理解为线程间通讯的数据单元。例如后台线程在处理数据完毕后需要更新

Z153041121的专栏 1422

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android消息管理是什么意思,Android消息处理机制4——Looper

Android消息处理机制系列文章整体内容如下一 使用Class used to run a message loop for a thread. Threads by default do not have a message loop associated with them; to create one, call prepare in the thread that is to run ...

weixin_34608222的博客 162

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android异步消息处理机制之Handler、Looper、Message

为什么用异步消息处理机制? 因为Android UI线程是线程不安全的,在子线程中更新UI会直接程序崩溃,另外当UI线程需要执行一个比较耗时的操作的话(IO操作,网络通信等),若是执行时间超过5s,程序会直接ANR,为了解决上述问题,可以使用异步消息处理机制Handler,Handler有两大用处: (1) . 在未来的某个时间点执行调度Message或者Runnable对象 (2) . 将执...

小马快跑的博客 1656

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android的消息处理机制(Looper,Handler,Message)

一 前言 在正式剖析Handle机制的原理前,我们先来了解一下相关的术语: 通信的同步(Synchronous):只客户端在向服务器发送请求时,必须要等到服务器返回结果,客户端才会继续发送其他的请求。 通信的异步(Asynchronous) : 指客户端在发送请求后,不必等待服务端的回应就可以发送下一个请求。 所谓同步调用,就是在一个函数或方法调用时,没有得到结果之前,该调用就不返回,直到返回结果。异步调用和同步是相对的,在一个异步调用发起后,被调用者立即返回给调用者,但是调用者不能立刻得到结果,被

qq_39431405的博客 920

Android消息处理机制:源码剖析Handler、Looper,并实现图片异步加载

引言我们在做 Android 开发时,常常需要实现异步加载图片/网页/其他。事实上,要实现异步加载,就需要实现线程间通信,而在 Android 中结合使用 Handler、Looper、Message 能够让不同的线程通信,完成异步任务。虽然 Android 官方为我们提供了 AsyncTask 类来完成异步任务,但这个类存在许多问题,并不好用,而且,AsyncTask 也是通过 Handler 和

追风筝的吃货,汪~ 6451

安卓消息处理机制(Looper,Handler,Message)

本文会通过详细解读安卓源码来彻底搞清楚安卓消息处理机制。消息处理机制主要涉及四个类:Looper,Message,MessageQueue,Handler。本文会详细解读这4个类是如何实现的。

androider_xy的博客 427

Android消息处理机制——Looper,Handler,Message,MessageQueue

题外话: 过去半年都没有

Abel Joo 尘归尘,土归土。 1699

Android 消息处理机制(Looper、Handler、MessageQueue,Message)

Android 消息处理机制估计都被写烂了,但是依然还是要写一下,因为Android应用程序是通过消息来驱动的,Android某种意义上也可以说成是一个以消息驱动的系统,UI、事件、生命周期都和消息处理机制息息相关,并且消息处理机制在整个Android知识体系中也是尤其重要,在太多的源码分析的文章讲得比较繁琐,很多人对整个消息处理机制依然是懵懵懂懂,这篇文...

cpongo5 540

Android异步消息处理机制:Handler与Looper原理详解

异步消息处理是现代移动开发中的核心架构,通过生产者-消费者模型实现线程间安全通信。其核心组件包括Message(消息载体)、Handler(处理器)、MessageQueue(队列)和Looper(循环器),共同构建了Android的线程通信基础。在UI线程更新等典型场景中,这种机制能有效避免阻塞并保证线程安全。技术实现上采用对象池优化Message创建,通过优先级队列管理消息分发,并支持同步屏障等高级特性。对于开发者而言,理解Handler的内存泄漏防护和消息洪峰处理策略尤为重要,这些优化手段能显著提升应

weixin_30596023的博客 402

Android 从源码角度分析消息处理机制(Handler,Looper,Message)

Android 从源码角度分析消息处理机制(Handler,Looper,Message)前言在Android中,修改UI的操作必须要放入到主线程中。而我们的网络请求往往是长时操作,需要放入到子线程进行请求。可以通过Handler实现不同线程间的通信。对于如何实现的,网上有很多的教程或博文,也解释的非常清楚,这里不在多叙。但在使用过程中,我们可能会有一些疑问: 为什么可以通过Handler实现不同的

茅屋 1154

android的消息处理机制——Looper,Handler,Message

转载子:http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html 作为一个大三的预备程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设计思想。android源码中包含了大量的设计模式,除此以外,android sdk还精心为我们设计了各种helper类,对于和我一样渴望水平得到

wang_kun888的博客 409

【Android 开发】: Android 消息处理机制之四: Android 消息循环 Looper 及其源码解析

上一讲我们学习Handler和Message的一些使用方式,我们知道Handler它会发送消息和处理消息,并且关联一个子线程,如何发送消息入队和出队处理消息等这些都是交给Looper去管理分发的,也就是它是负责整个消息队列运转的一个类,这一讲我们就来学习一下Android中的Looper的操作。   查看Android Looper类的描述   这个类是用来在一个线程中运行一个消息循环(Mes

AHuier_Techblog :如果我不在写代码,你就 @me 4964
上一篇: 配置WifiConfiguration
下一篇: 深入理解android消息处理机制
It_BeeCoder
博客等级 码龄10年 967粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值