消息机制
-
用途
- 线程间的通信
-
Message
- 具体消息实体
-
MessageQueue
- 消息队列,用于存储和获取消息
-
Looper
-
内部维护一个
MessageQueue
对象,通过一个无限循环的loop方法,持续从MessageQueue
获取dispatchMessage
并处理消息handleMessage
。 -
消息循环起始于
Looper
的loop
方法调用,此方法内部是一个无限的for
循环,线程一旦进入loop
就再也出不去了,除非主动退出。以后线程所做的事有三件:取消息、执行消息处理函数和等待 -
使用Looper.prepare()和Looper.loop()创建了消息队列就可以让消息处理在该线程中完成。
-
创建了消息队列才能使得子线程和主线程通信,例如更新UI
-
写在Looper.loop()之后的代码不会被立即执行,当调用后mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行。
-
Looper对象通过MessageQueue来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。
-
退出消息循环,手动在Activity的销毁方法中中调运thread.getLooper().quit(),避免内存泄露
-
一些API使用
-
Looper.prepare()-为当前线程创建一个Looper
-
Looper.loop()-开启消息循环,只有调用该方法,消息循环系统才会开始循环;
-
Looper.prepareMainLooper()-为主线程也就是ActivityThread创建Looper使用;
-
Looper.getMainLooper()-通过该方法可以在任意地方获取到主线程的Looper;
-
Looper.quit() Looper.quitSafely()-退出Looper,自主创建的Looper建议在不使用的时候退出
-
-
-
Handler
-
Handler负责消息的发送和处理,通过它可以实现其他支线线程与主线程之间的消息通讯。
-
new 一个Handler需要实现handleMessage方法
-
mCameraHandler = new Handler(mCameraThread.getLooper()){ @Override public void handleMessage(Message msg) { } };
-
-
常用API
-
sendMessage( )
-
post( Runnable )
-
-
HandlerThread
- 简介
线程间通信的时候,比如Android中常见的更新UI,涉及到的是子线程和主线程之间的通信,实现方式就是Handler+Looper,但是要自己手动操作Looper,所以谷歌封装了HandlerThread类
-
特点
-
继承Thread
-
内部维护了一个Looper实例
-
通过获取HandlerThread的looper对象创建Handler对象
-
创建HandlerThread后必须先调用HandlerThread.start()方法
-
线程使用完毕后,需要调用quitSafely(),退出消息循环,避免内存泄露
-