文章目录

  • 一、Looper 初始化
  • 二、Looper 遍历消息队列 MessageQueue
  • 三、完整 Looper 代码

一、Looper 初始化


Looper 是 线程本地变量 , 在每个线程中 , 可以通过线程调用 ThreadLocal 变量的 get 方法获取该线程对应的对象副本 , 调用 ThreadLocal 变量的 set 方法 , 设置该线程对应类型的对象副本 ;

Looper 调用 prepare 方法进行初始化 , 在该方法中处理 线程本地变量的先关初始化与设置 ,

如果之前已经初始化过 , 本次调用 prepare 方法是第二次调用 , 则会 抛出异常 ,

如果之前没有初始化过 , 那么创建一个 Looper , 然后调用线程本地变量 ThreadLocal 的 set 方法 , 将该 Looper 对象设置成线程本地变量 ;

    /*** 一个线程只能有一个 Looper* 使用 ThreadLocal 来保存该 Looper* 是线程内部存储类 , 只能本线程才可以得到存储的数据 ;*/static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<>();/*** 准备 Looper 方法*/public static void prepare(){System.out.println("prepare 创建 Looper ");// 先进行判断 , 如果当前线程已经有了 Looper , 那就抛出异常if(sThreadLocal.get() != null){throw new RuntimeException("当前线程已存在 Looper");}// 如果不存在 Looper , 就创建一个 LoopersThreadLocal.set(new Looper());}

二、Looper 遍历消息队列 MessageQueue


在 Looper 线程中 , 最后一句代码肯定是 Looper.loop() , 执行该方法后 , 就开启了一个无限循环 ,

不断从 消息队列 MessageQueue 中获取消息 , 然后发送给该 消息 Message 对应的 Handler ,

哪个 Handler 发送的消息 , 就将消息在送回给哪个 Handler ;

消息同步 : 当 消息队列 MessageQueue 为空时 , 无法从消息队列中获取数据 , 此时线程会 阻塞 , 直到有新的消息到来后 , 解除阻塞 ;

Looper 循环遍历消息队列部分代码 :

    /*** 不断从 消息队列 MessageQueue 中取出 Message 消息执行*/public static void loop(){System.out.println("开始无限循环获取 Message");// 获取当前线程的 LooperLooper looper = Looper.looper();// 从当前线程的 Looper 获取 消息队列 MessageQueueMessageQueue messageQueue = looper.mQueue;// 不断从 消息队列中获取 消息 , 分发到发送消息的 Handler 中执行for(;;){// 获取消息队列中的第一个消息Message next = messageQueue.next();// 分发到发送该消息的 Handler 中执行next.target.handleMessage(next);}}

三、完整 Looper 代码


package kim.hsl.handler;public class Looper {/*** 一个线程只能有一个 Looper* 使用 ThreadLocal 来保存该 Looper* 是线程内部存储类 , 只能本线程才可以得到存储的数据 ;*/static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<>();/*** 消息队列*/public MessageQueue mQueue;/*** Looper 构造函数*/private Looper(){mQueue = new MessageQueue();}/*** 获取当前线程对应的 Looper* @return*/public static Looper looper(){return sThreadLocal.get();}/*** 准备 Looper 方法*/public static void prepare(){System.out.println("prepare 创建 Looper ");// 先进行判断 , 如果当前线程已经有了 Looper , 那就抛出异常if(sThreadLocal.get() != null){throw new RuntimeException("当前线程已存在 Looper");}// 如果不存在 Looper , 就创建一个 LoopersThreadLocal.set(new Looper());}/*** 不断从 消息队列 MessageQueue 中取出 Message 消息执行*/public static void loop(){System.out.println("开始无限循环获取 Message");// 获取当前线程的 LooperLooper looper = Looper.looper();// 从当前线程的 Looper 获取 消息队列 MessageQueueMessageQueue messageQueue = looper.mQueue;// 不断从 消息队列中获取 消息 , 分发到发送消息的 Handler 中执行for(;;){// 获取消息队列中的第一个消息Message next = messageQueue.next();// 分发到发送该消息的 Handler 中执行next.target.handleMessage(next);}}}

【Android 异步操作】手写 Handler ( 循环者 Looper | Looper 初始化 | Looper 遍历消息队列 MessageQueue )相关推荐

  1. 【Android 异步操作】手写 Handler ( 总结 | Message | MessageQueue | Looper | Handler ) ★

    文章目录 一.Message 消息 二.Handler 消息处理者 三.MessageQueue 消息队列 四.Looper 循环者 五.关于 Looper 线程本地变量的说明 一.Message 消 ...

  2. 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )

    文章目录 一.Message 消息 二.ThreadLocal 线程本地变量 三.Looper 中的消息队列 MessageQueue 一.Message 消息 模仿 Android 中的 Messa ...

  3. 【Android 异步操作】手写 Handler ( 消息队列 MessageQueue | 消息保存到链表 | 从链表中获取消息 )

    文章目录 一.MessageQueue 消息队列存储消息 二.MessageQueue 消息队列取出消息 三.消息队列完整代码 一.MessageQueue 消息队列存储消息 Message 链表 : ...

  4. 【Android 异步操作】手写 Handler ( Handler 发送与处理消息 | Handler 初始化 | 完整 Handler 代码 )

    文章目录 一.Handler 发送与处理消息 ( 两大功能 ) 二.Handler 初始化 三.完整 Handler 代码 一.Handler 发送与处理消息 ( 两大功能 ) Handler 有两个 ...

  5. 将tensorflow训练好的模型移植到Android (MNIST手写数字识别)

    将tensorflow训练好的模型移植到Android (MNIST手写数字识别) [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/det ...

  6. android 电子签名 手写签名 功能实现

    android 电子签名  手写签名 功能实现 这个手写的效果 就是一个 重写的的自定义的view  代码如下: package com.example.hand.views;import java. ...

  7. android 手写 流畅,提高Android应用手写流畅度(基础篇)

    在使用android类的手写应用时,整体上都有这样一个印象:android的手写不流畅.不自然,和苹果应用比起来相差太远.本文结合作者亲身经历,介绍一下有效提高手写流畅度的几种方法: 1.未做任何处理 ...

  8. 16.算法调用优先于手写的循环

    STL算法涉及面很广,这意味着你本该编写循环来完成的任务也可以用STL算法来完成. 例如,有一个Widget类: class Widget { public:...void redraw() cons ...

  9. java实现手写签名,Android实现手写签名

    本文实例为大家分享了Android手写签名的实现方法,产品要求用户可以在app上签协议..所以得弄个手写签名版,参考了一些资料自己写了个PaintView去继承View,实现签名功能. package ...

最新文章

  1. 面试官:谈谈JWT鉴权的应用场景及使用建议?
  2. java web 笔试 题_JavaWeb综合笔试题(带答案).doc
  3. QML模块定义qmldir文件
  4. SQL Server误区30日谈-Day27-使用BACKUP ... WITH CHECKSUM可以替代DBCC CheckDB
  5. tcode SLG1 Object determination logic
  6. 详细分析如何利用python批量爬取百度图片
  7. python使用md5加密_如何使用Python创建自己的加密货币
  8. phoneGap技术分析
  9. sqlite3 命令行操作
  10. java excel 打勾_如何在excel中打钩
  11. winrar打开导航已取消是什么原因
  12. 819A - 如何成为一名职业程序员
  13. 盘点各大互联网公司2017中秋月饼设计,你最喜欢哪一个?
  14. DOTA全英雄装备介绍+物品简称[图文]
  15. android一键 iphone,流畅吃鸡最全教程来了:安卓iPhone一键解锁最高画质
  16. 为打印到OneNote中的PDF添加链接目录
  17. Android9.0 完全隐藏导航栏、状态栏
  18. saber与matlab,saber与matlab的比较 (1)
  19. 心里藏着小星星,生活才能亮晶晶
  20. 在应用中嵌入Python - lf8289的专栏 - CSDNBlog

热门文章

  1. [bzoj2893] 集合计数
  2. Intellij IDEA常用配置详解
  3. 2017年9月11日
  4. Selenium 3 + BrowserMobProxy 2.1.4 模拟浏览器访问 (含趟坑)
  5. Linux命令:tail
  6. android studio 模拟器中文乱码
  7. 将string转换成UTF8在进行请求
  8. 在Itanium2、Intel Fortran Compiler上安装VASP4.6
  9. 架构师书单 2nd Edition
  10. Laravel中使用模型对数据进行操作