这篇文章介绍了Android消息机制Handler用法总结,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1.简述

Handler消息机制主要包括: MessageQueue、 Handler、 Looper、Message。

  • Message:需要传递的消息,可以传递数据;
  • MessageQueue:消息队列,但是它的内部实现并不是用的队列,而是通过单链表的数据结构来维护消息列表,因为单链表在插入和删除上比较有优势。主要功能是向消息池投递消息( MessageQueue.enqueueMessage)和取走消息池的消息( MessageQueue.next)。
  • Handler:消息辅助类,主要功能是向消息池发送各种消息事件( Handler.sendMessage)和处理相应消息事件( Handler.handleMessage);
  • Looper:消息控制器,不断循环执行( Looper.loop),从MessageQueue中读取消息,按分发机制将消息分发给目标处理者。

2.异步线程切换原理

class LooperThread extends Thread {public Handler mHandler;public void run() {Looper.prepare();mHandler = new Handler() {public void handleMessage(Message msg) {// process incoming messages here}};Looper.loop();}}

每一个异步线程,都维护着唯一的一个Looper,每一个Looper会初始化(维护)一个MessageQueue,之后进入一个无限循环一直在读取MessageQueue中存储的消息,如果没有消息那就一直阻塞等待。

我们在实例化handler的过程中,会先得到当前所在线程的looper对象,之后得到与该looper对象相对应的消息队列,看源码Handler中持有Looper、MessageQueue。

private static void handleCallback(Message message) {message.callback.run();
}final Looper mLooper;
final MessageQueue mQueue;
final Callback mCallback;

当我们发送消息的时候,即handler.sendMessage或者handler.post,会将msg中的target赋值为handler自身,这就是实现message从一个线程到另外一个线程的传递的本质,之后加入到消息队列中。

private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {msg.target = this;if (mAsynchronous) {msg.setAsynchronous(true);}return queue.enqueueMessage(msg, uptimeMillis);
}

我们一般会重写handlerMessage方法处理消息,这将会在msg.target.disPatchMessage方法中被回调,从而实现了message从一个线程到另外一个线程的传递。

3.总结

  • 1.Handler 的背后有 Looper、MessageQueue 支撑,Looper 负责消息分发,MessageQueue 负责消息管理;
  • 2.在创建 Handler 之前一定需要先创建 Looper,Looper 有退出的功能,但是主线程的 Looper 不允许退出;
  • 3.异步线程Looper,Looper.prepare()创建Looper,Looper.loop()开始轮询,需要自己调用 Looper.myLooper().quit()退出;
  • 4.Runnable 被封装进了 Message,可以说是一个特殊的 Message;
  • 5.Handler.handleMessage() 所在的线程是 Looper.loop() 方法被调用的线程;
  • 6.Handler内存泄漏的原因

原因:MessageQueue持有Message,Message持有activity,delay多久,message就会持有activity多久。

解决方案:静态内部类、弱引用,最后不要忘记调用Handler.removeCallbacksAndMessages(null)清空所有消息。

public class SampleActivity extends Activity {/*** Instances of static inner classes do not hold an implicit* reference to their outer class.*/private static class MyHandler extends Handler {private final WeakReference mActivity;public MyHandler(SampleActivity activity) {mActivity = new WeakReference(activity);}@Overridepublic void handleMessage(Message msg) {SampleActivity activity = mActivity.get();if (activity != null) {// ...}}}// MyHandlerprivate final MyHandler mHandler = new MyHandler(this);/*** Instances of anonymous classes do not hold an implicit* reference to their outer class when they are "static".*/private static final Runnable sRunnable = new Runnable() {@Overridepublic void run() { /* ... */ }};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Post a message and delay its execution for 10 minutes.mHandler.postDelayed(sRunnable, 1000 * 60 * 10);// Go back to the previous Activity.finish();}@Overrideprotected void onDestroy() {super.onDestroy();//mHandler.removeCallbacksAndMessages(null);}
}

Android消息机制Handler用法相关推荐

  1. Android消息机制(Handler机制) - 线程的等待和唤醒

    我们都知道,Android的Handler机制,会在线程中开启消息循环,不断的从消息队列中取出消息,这个机制保证了主线程能够及时的接收和处理消息. 通常在消息队列中(MessageQueue)中没有消 ...

  2. Android 消息机制 Handler总结

    老久就想着写一篇 关于消息机制的文章来总结一下. Android的消息机制主要是指Handler 的运行机制.我们在开发时有的时候需要在子线程进行耗时的I/o 操作,可能是读取文件或者 访问网络等,有 ...

  3. 通过源码简要分析之Android消息机制Handler、Looper、MessageQueue运行机制

    用了许久的Handler,对于Handler的使用确实是比较熟悉,但是具体内部是如何运作的,却只是模糊的.Handler发出的消息怎么到达MessageQueue?MessageQueue的数据怎么被 ...

  4. android 消息轮训,Android消息机制Handler,有必要再讲一次

    我们在日常开发中,总是不可避免的会用到 Handler,虽说 Handler 机制并不等同于 Android 的消息机制,但 Handler 的消息机制在 Android 开发中早已谙熟于心,非常重要 ...

  5. android消息机制 Message, Looper,Handler

    其原理为:消息线程(默认是主线程,也就是UI线程),维护一个消息循环和一个消息队列,工作线程向消息队列中添加消息,消息循环从队列中取出消息并处理. 其中Looper类负责消息循环和消息队列,Messa ...

  6. android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码

    提起Android消息机制,想必都不陌生.其中包含三个部分:Handler,MessageQueue以及Looper,三者共同协作,完成消息机制的运行.本篇文章将由浅入深解析Android消息机制的运 ...

  7. Android 系统(177)---Android消息机制分析:Handler、Looper、MessageQueue源码分析

    Android消息机制分析:Handler.Looper.MessageQueue源码分析 1.前言 关于Handler消息机制的博客实际上是非常多的了. 之前也是看别人的博客过来的,但是过了一段时间 ...

  8. Android 消息机制(Handler运行机制)

     1 Android 消息机制 Android 的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑 2 为什么要用Handler消息 ...

  9. Android 进阶14:源码解读 Android 消息机制( Message MessageQueue Handler Looper)

    不要心急,一点一点的进步才是最靠谱的. 读完本文你将了解: 前言 Message 如何获取一个消息 Message.obtain() 消息的回收利用 MessageQueue MessageQueue ...

最新文章

  1. kafka中controller的作用_Kafka 常见问题汇总
  2. vue - .babelrc
  3. 【MyBatis】学习纪要六:动态SQL
  4. mysql grant show_mysql之基础操作grant、show、repair、log_error等
  5. 拥抱.NET Core系列:依赖注入(2)
  6. 拒绝网络*** 如何防御Sniffer***
  7. bat脚本 -- 初步接触
  8. 【王道操作系统笔记】进程定义组成组织方式特征
  9. 触控获取坐标判断滑动方向
  10. C# IEnumerator与 IEnumerable(2) 托管使用
  11. 如何通过DAU分析活跃用户?(案例:python绘制箱体图)
  12. 怎么将两台计算机ping接通,小编教你手把手教你一根网线连接两台电脑实现数据传送...
  13. 大中型企业建立IT服务台的意义及实践
  14. 【火爆全网的抖音无人直播项目:挤地铁源代码】
  15. 过年别再逼婚了,《黑镜》里的AI相亲系统是对爱情最好的匹配
  16. 采购订单税码检查增强(badi)
  17. 8086的储存器编址
  18. 腾讯蚂蚁字节美团后台实习面经
  19. 算法初体验之欧几里得算法
  20. 【172. 阶乘后的零】

热门文章

  1. TensorFlow与PyTorch之争,哪个框架最适合深度学习
  2. 早餐组合(购买方案)
  3. 美多商城之验证码(短信验证码2)
  4. 爬虫基础(二)之http协议复习
  5. python位运算符
  6. kalilinux安装搜狗输入法
  7. DEV为什么不能输出小数 浮点数?
  8. 硬核教程:五步掌握用VSCode进行高效Python开发
  9. DeepLabv3:语义图像分割
  10. 用于RGB-D显著目标检测的自监督表示学习