1、简介
大体理解为:
Handler 在使用的时候一般要依附于一个对象,很多时候 handler 延时发送的时候 ,所依附的对象得不到释放,于是出现了 handler 泄露。
2、方法一避免Handler 泄露
1)在对象被销毁的时候 断掉与Handler 的联系,销毁Handler 消息的处理。
@Override
public void onDestroy() {
// 移除所有的handler 消息.
mHandler.removeCallbacksAndMessages(null);
}
removeCallbacks(Runnable r)和removeMessages(int what) 可以删除制定的 message
3、方法二添加弱连接
静态类不持有外部类的对象,所以你的Activity可以随意被回收,同时添加handler 和 对象之间的弱引用 代码如下:
/**
*
* 实现的主要功能。
*
* @version 1.0.0
* @author Abay Zhuang <br/>
* Create at 2014-7-28
*/
public class HandlerActivity2 extends Activity {
private static final int MESSAGE_1 = 1;
private static final int MESSAGE_2 = 2;
private static final int MESSAGE_3 = 3;
private final Handler mHandler = new MyHandler(this);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler.sendMessageDelayed(Message.obtain(), 60000);
// just finish this activity
finish();
}
public void todo() {
};
private static class MyHandler extends Handler {
private final WeakReference<HandlerActivity2> mActivity;
public MyHandler(HandlerActivity2 activity) {
mActivity = new WeakReference<HandlerActivity2>(activity);
}
@Override
public void handleMessage(Message msg) {
System.out.println(msg);
if (mActivity.get() == null) {
return;
}
mActivity.get().todo();
}
}
文件参考:
Android中使用Handler造成内存泄露的分析和解决
https://blog.csdn.net/jdsjlzx/article/details/51386440