Handler 使用
Handler
(发送与接收消息)
Looper
(轮循)→ Looper 对象中 loop() 方法轮询 MessageQueue
MessengeQueue
消息队列(存储多个消息)「链表队列,链表结构插入与查询速度快」
Handler、Looper、MessengeQueue 关系
Handler
负责发送与接收消息, MessageQueue
链表队列接收消息存储在队列中,「队列中消息先进先出」,Looper
对象中 loop()
方法中 for(;;)
死循环一直轮询 MessageQueue
队列中消息,使用 handler dispatchMessage()
方法处理消息,dispatchMessage()
方法中调用创建的 Handler 回调方法 handleMessage()
;
Handler 使用
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
//直接使用mHandler.obtainMessage()获取消息
Message msg = mHandler.obtainMessage();
Person person = new Person();
person.name = "liudongbing";
msg.what = 0x01;
msg.obj = person;
//发送消息
mHandler.sendMessage(msg);
向指定的handler发送消息
msg.sendToTarget();
「Handler 内存泄漏解决方案」
直接使用Handler接收处理消息,IDE 提示This Handler class should be static or leaks might occur
「这个Handler 必须是static的,否则就会引发内存泄露」
Handler内存泄漏版本使用方案:
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
Handler 改进后使用方案:
private final MyHandler mHandler = new MyHandler(this);
private static class MyHandler extends Handler {
WeakReference<GosAppSettingActivity> mActivity;
public MyHandler(GosAppSettingActivity activity) {
mActivity = new WeakReference<GosAppSettingActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
AppSettingActivity activity = mActivity.get();
if (activity != null) {
switch (msg.what) {
case MSG_WHAT_TASK_OVER:
// 使用传入activiy获取其内部字段;
activity.mAppAdapter.updateAppInfo(activity.mAppInfos);
break;
default:
break;
}
}
super.handleMessage(msg);
}
}
参考博客 http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html