Looper、MessageQueue、Message、Handler的关系
讲到Handler,肯定离不开Looper、MessageQueue、Message这三者和Handler之间的关系
Looper
每一个线程只有一个Looper,每个线程在初始化Looper之后,然后Looper会维护好该线程的消息队列,用来存放Handler发送的Message,并处理消息队列出队的Message。
它的特点是它跟它的线程是绑定的,处理消息也是在Looper所在的线程去处理,所以当我们在主线程创建Handler时,它就会跟主线程唯一的Looper绑定,从而我们使用Handler在
子线程发消息时,最终也是在主线程处理,达到了异步的效果。
那么就会有人问,为什么我们使用Handler的时候从来都不需要创建Looper呢?
这是因为在主线程中,ActivityThread默认会把Looper初始化好,prepare以后,当前线程就会变成一个Looper线程。
MessageQueue
MessageQueue是一个消息队列,用来存放Handler发送的消息。每个线程最多只有一个MessageQueue。
MessageQueue通常都是由Looper来管理,而主线程创建时,会创建一个默认的Looper对象,
而Looper对象的创建,将自动创建一个MessageQueue。其他非主线程,不会自动创建Looper。
Message
消息对象,就是MessageQueue里面存放的对象,一个MessageQueu可以包括多个Message。当我们需要发送一个Message时,我们一般不建议使用new Message()的形式来创建,更推荐使用
Message.obtain()来获取Message实例,因为在Message类里面定义了一个消息池,当消息池里存在未使用的消息时,便返回,如果没有未使用的消息,则通过new的方式创建返回,所以使
用Message.obtain()的方式来获取实例可以大大减少当有大量Message对象而产生的垃圾回收问题。
Handler的主要用途
推送未来某个时间点将要执行的Message或者Runnable到消息队列。
在子线程把需要在另一个线程执行的操作加入到消息队列中去。
讲到Handler,肯定离不开Looper、MessageQueue、Message这三者和Handler之间的关系
Looper
每一个线程只有一个Looper,每个线程在初始化Looper之后,然后Looper会维护好该线程的消息队列,用来存放Handler发送的Message,并处理消息队列出队的Message。
它的特点是它跟它的线程是绑定的,处理消息也是在Looper所在的线程去处理,所以当我们在主线程创建Handler时,它就会跟主线程唯一的Looper绑定,从而我们使用Handler在
子线程发消息时,最终也是在主线程处理,达到了异步的效果。
那么就会有人问,为什么我们使用Handler的时候从来都不需要创建Looper呢?
这是因为在主线程中,ActivityThread默认会把Looper初始化好,prepare以后,当前线程就会变成一个Looper线程。
MessageQueue
MessageQueue是一个消息队列,用来存放Handler发送的消息。每个线程最多只有一个MessageQueue。
MessageQueue通常都是由Looper来管理,而主线程创建时,会创建一个默认的Looper对象,
而Looper对象的创建,将自动创建一个MessageQueue。其他非主线程,不会自动创建Looper。
Message
消息对象,就是MessageQueue里面存放的对象,一个MessageQueu可以包括多个Message。当我们需要发送一个Message时,我们一般不建议使用new Message()的形式来创建,更推荐使用
Message.obtain()来获取Message实例,因为在Message类里面定义了一个消息池,当消息池里存在未使用的消息时,便返回,如果没有未使用的消息,则通过new的方式创建返回,所以使
用Message.obtain()的方式来获取实例可以大大减少当有大量Message对象而产生的垃圾回收问题。
Handler的主要用途
推送未来某个时间点将要执行的Message或者Runnable到消息队列。
在子线程把需要在另一个线程执行的操作加入到消息队列中去。