Handler 原理
Handler 使用
Handler
(發(fā)送與接收消息)
Looper
(輪循)→ Looper 對(duì)象中 loop() 方法輪詢 MessageQueue
MessengeQueue
消息隊(duì)列(存儲(chǔ)多個(gè)消息)「鏈表隊(duì)列,鏈表結(jié)構(gòu)插入與查詢速度快」
Handler、Looper、MessengeQueue 關(guān)系
Handler
負(fù)責(zé)發(fā)送與接收消息, MessageQueue
鏈表隊(duì)列接收消息存儲(chǔ)在隊(duì)列中,「隊(duì)列中消息先進(jìn)先出」,Looper
對(duì)象中 loop()
方法中 for(;;)
死循環(huán)一直輪詢 MessageQueue
隊(duì)列中消息,使用 handler dispatchMessage()
方法處理消息,dispatchMessage()
方法中調(diào)用創(chuàng)建的 Handler 回調(diào)方法 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;
//發(fā)送消息
mHandler.sendMessage(msg);
向指定的handler發(fā)送消息
msg.sendToTarget();
「Handler 內(nèi)存泄漏解決方案」
直接使用Handler接收處理消息,IDE 提示This Handler class should be static or leaks might occur
「這個(gè)Handler 必須是static的,否則就會(huì)引發(fā)內(nèi)存泄露」
Handler內(nèi)存泄漏版本使用方案:
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
Handler 改進(jìn)后使用方案:
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獲取其內(nèi)部字段;
activity.mAppAdapter.updateAppInfo(activity.mAppInfos);
break;
default:
break;
}
}
super.handleMessage(msg);
}
}
參考博客 http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html