Android中的消息机制Handler、Message、Looper之间关系

时间:2021-12-11 17:20:26

概念

1、什么是消息队列(MessageQueue)?

消息队列中存放了大量的消息(Message),采用先进先出的方式来管理Message

2、什么是消息(Message)?

代表一个行为(what)或者一串动作(Runnable),有两处会用到Message:Handler和Messenger

3、什么是Handler?

它把消息发送给Looper管理的MessageQueue,并负责处理Looper分给它的消息,主要用来在线程中发消息通知ui线程更新ui。

4、什么是Looper?

每个线程只有一个Looper,比如UI线程中,系统会默认的初始化一个Looper对象,它负责管理MessageQueue,不断的从MessageQueue中取消息,并将相对应的消息分给Handler处理

5、线程有没有Looper有什么区别?

线程如果没有Looper,就没有消息队列,就无法处理消息,线程内部就无法使用Handler。这就是为什么在子线程内部创建Handler会报错
6、为什么要用Handle这样的一个机制?

 因为在Android系统中UI操作并不是线程安全的,如果多个线程并发的去操作同一个组件,可能导致线程安全问题。为了解决这一个问题,android制定了一条规则:只允许UI线程来修改UI组件的属性等,也就是说必须单线程模型,这样导致如果在UI界面进行一个耗时叫长的数据更新等就会形成程序假死现象 也就是ANR异常,如果20秒中没有完成程序就会强制关闭。所以比如另一个线程要修改UI组件的时候,就需要借助Handler消息机制了。

7、android中Handle类的主要作用?

1、在新启动的线程中发送给消息

2、在主线程获取、处理消息

8、如何让线程有Looper从而正常使用Handler?步骤:

在线程的run方法中加入如下两句:

1、调用Looper的prepare()方法为当前线程创建Looper对象,创建Looper对象时,它的构造器会自动的创建相对应的MessageQueue

2、创建Handler子类的实例,重写HandleMessage()方法,该方法处理除UI线程以外线程的消息

3、调用Looper的loop()方法来启动Looper


消息队列和Looper的工作机制

一个Handler会有一个Looper,一个Looper会有一个消息队列,Looper的作用就是循环的遍历消息队列,如果有新消息,就把新消息交给它的目标处理。每当我们用Handler来发送消息,消息就会被放入消息队列中,然后Looper就会取出消息发送给它的目标target。一般情况,一个消息的target是发送这个消息的Handler,这么一来,Looper就会把消息交给Handler处理,这个时候Handler的dispatchMessage方法就会被调用,一般情况最终会调用Handler的handleMessage来处理消息,用handleMessage来处理消息是我们常用的方式。


下面是消息机制中几个重要成员的关系图:

Android中的消息机制Handler、Message、Looper之间关系


Android中的消息机制Handler、Message、Looper之间关系