Android中的Handler机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中的Handler机制相关的知识,希望对你有一定的参考价值。

参考技术A Handler常用于android中线程间通信
消息处理流程有一张图可以参考下

这里有几个重要的关键点(按我自己理解翻译的一下)
1.Message:消息
2.MessageQueue:消息队列
3.Handler:消息处理器,负责消息的收发,可以存在多个
4.Looper:循环消息分发器

通信嘛,要先有传递的信息Message

MessageQueue,消息同时发又处理不完又需要保持同步,于是有了消息队列,让消息按顺序处理

Looper,消息分发器,在其loop()后会循环消息队列去取消息进行分发处理,如果没有则会阻塞

最后是Handler,负责消息的收发处理,sendMessage发送消息,重写handleMessage方法即可处理收到的消息(这里主线程直接获取了looper)如果是子线程则需要先对Looper就行初始化

介绍完功能来顺一下流程
首先主线程中ActivityThread中main方法创建了Looper

这里进入Looper

当我们需要传递消息时
通过获取对应线程Looper来初始化Handler,

初始化一个消息,Message.obtain()来获得而不是new一个Message,因为Message内部有一个消息池子,消息收到处理后,内部信息清除就可以重复使用,避免资源浪费。

然后插入到Handler所在的消息队列

然后Loop发现有新消息,派发到对应的Handler来处理消息dispatchMessage

Handler.dispatchMessage,先判断是否有callback(即Runnable),如果有走handleCallback,否则执行handleMessage

简单总计一下:
线程间通信每个线程都需要初始化Looper和消息队列,Loop不停向消息队列读取消息,通过不同线程的Handler来发送信息,如A线程有1,2两个Hander,B线程有3,4两个Hander,A线程调用3,4来发送信息,B线程即可收到 A线程发来的信息

android中的Handler消息机制

为什么要引用消息机制?

    1:ANR(application not response)应用无响应     主线程(UI线程)

    2:如果在主线程中进行了耗时操作,就会导致ANR(比如链接网络,拷贝大的数据)Thread.sleep()

    3:   避免ANR可以吧耗时操作放到子线程中   就是自己new一个线程

    4:android4.0之后谷歌强制要求链接网络不能在主线程中进行访问

    5:只有主线程(UI线程)才可以更新UI,注意:吐司是一个View,也不能在子线程更新UI

 

  

    Handler使用步骤:

   

  

以上是关于Android中的Handler机制的主要内容,如果未能解决你的问题,请参考以下文章

Android中的Handler机制

Android Handler消息传递机制

Android Handler消息传递机制

深入分析Android-Handler消息机制

Android面试 Handler机制

Android Handler机制