handler lead 的分析和解決
[TOC]
現(xiàn)象及分析
在 Activity 中直接 new 一個普通 Handler 的時候會提示 This Handler class should be static or leaks might occur
。
原因是普通的內(nèi)部類會持有外部類的引用覆劈,從而導(dǎo)致 Activity 無法被回收的問題旺韭。所有才會提示 Handler should be static雷滚。
解決方案
在工具類中定義 static Handler 內(nèi)部類,類內(nèi)部使用 WeakReference 存儲 acitivity 實現(xiàn)的 MyHandlerCallback 接口仓技,保證能及時釋放。
工具類:Util.java
public interface MyHandlerCallback {
public void onHanlderCallback(Message msg);
}
public static class MyHandler extends Handler {
private final WeakReference<MyHandlerCallback> mCallback;
public MyHandler(MyHandlerCallback callback) {
mCallback = new WeakReference<>(callback);
}
@Override
public void handleMessage(Message msg) {
mCallback.get().onHanlderCallback(msg);
}
}
Activity 中使用,需要實現(xiàn) MyHandlerCallback 接口
private MyHandler mHandler = new MyHandler(this);
@Override
public void onHanlderCallback(Message msg) {
switch (msg.what) {
case MSG_DATA_LOADED:
setAdapter();
break;
default:
Log.e(TAG, msg + " can not be recognize");
}
}