消息机制的引入
- 在Android中,只有在UIThread中才能直接更新用户界面
- 在Android中,长时间的工作(IO,编解码,联网)都需要在WokerThread中执行
- 在分线程中获得服务器数据后,需要立即到主线程中去更新界面显示
如何实现线程间通信呢?
- 消息机制:Handler + Thread
- 异步任务:AsyncTask == Handler + ThreadPool
Message的使用
message是线程间通信的数据载体
- 对象的创建
Message.obtain(); // 有可能是新建的,也可能是复用消息池中
- 对象的使用
int what; // 标识
int args1; // 用于保存int数据
int args2; // 用于保存int数据
Object obj; // 用于保存对象数据
Handler target; // 保存处理消息的handler(发消息的handler)
long when; // 消息应该被处理的时间
Message next; // 有了此属性Message就可以形成队列
static Message pool; // 消息池 缓存用过的消息用于复用
Runnable callBack; // 用于处理当前消息的回调器
Handler的使用
发送/处理/移除消息
- 对象的创建:new Handler();
- 对象的使用:
// a.发送消息
发送即时消息:sendMessage(Message message);
发送延迟消息:sendMessageDelayed(Message message, long delayTime);
发送空消息:sendEmptyMessage(int what);
发送延迟消息:sendEmptyMessageDelayed(int what, long delayTime);
// b.处理消息
void HandleMessage(Message msg); // 回调方法
// c.移除消息
removeMessage(int what); // 移除指定what的未处理message
removeCallbacksAndMessage(Object token); // 如果token传null,移除所有未处理的消息
MessageQueue:消息队列
- 用来存放通过Handler发送的消息
- 它是一个按Message的when排序的优先级队列
Looper:循环器
- 负责循环取出Message Queue里面的当前需要处理的Message
- 交给对应的Handler进行处理
- 处理完后,将Message缓存到消息池中,以备复用
Handler的原理
- 一个线程开启循环模式持续监听并依次处理其他线程给它发的消息。
网友评论